From 04a5a938994ddb95cfaa9a74b180e457d3a2b5d0 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 2 Aug 2024 11:38:19 +0200 Subject: implement new lua interface --- src/state/view/mode.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/state/view/mode.rs (limited to 'src/state/view/mode.rs') diff --git a/src/state/view/mode.rs b/src/state/view/mode.rs new file mode 100644 index 0000000..3fa9c63 --- /dev/null +++ b/src/state/view/mode.rs @@ -0,0 +1,48 @@ +use mlua::{FromLua, IntoLua}; + +#[derive(Default, Debug, Clone, Copy)] +pub enum Mode { + #[default] + Normal, + Visual, + Insert, + Command, +} + +impl<'lua> FromLua<'lua> for Mode { + fn from_lua( + value: mlua::prelude::LuaValue<'lua>, + _lua: &'lua mlua::prelude::Lua, + ) -> mlua::prelude::LuaResult { + if value.is_string() { + match value.as_str().unwrap().to_lowercase().as_ref() { + "normal" => Ok(Mode::Normal), + "visual" => Ok(Mode::Visual), + "insert" => Ok(Mode::Visual), + "command" => Ok(Mode::Visual), + _ => Err(mlua::Error::runtime( + "mode needs to be 'normal', 'visual' or 'insert'", + )), + } + } else { + Err(mlua::Error::runtime( + "mode needs to be 'normal', 'visual' or 'insert'", + )) + } + } +} + +impl<'lua> IntoLua<'lua> for Mode { + fn into_lua( + self, + lua: &'lua mlua::prelude::Lua, + ) -> mlua::prelude::LuaResult> { + match self { + Mode::Normal => "normal", + Mode::Visual => "insert", + Mode::Insert => "visual", + Mode::Command => "command", + } + .into_lua(lua) + } +} -- cgit v1.2.3-70-g09d2