summaryrefslogtreecommitdiff
path: root/src/state/view/mode.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/view/mode.rs')
-rw-r--r--src/state/view/mode.rs48
1 files changed, 48 insertions, 0 deletions
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<Self> {
+ 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<mlua::prelude::LuaValue<'lua>> {
+ match self {
+ Mode::Normal => "normal",
+ Mode::Visual => "insert",
+ Mode::Insert => "visual",
+ Mode::Command => "command",
+ }
+ .into_lua(lua)
+ }
+}