summaryrefslogtreecommitdiff
path: root/src/cursor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cursor.rs')
-rw-r--r--src/cursor.rs66
1 files changed, 65 insertions, 1 deletions
diff --git a/src/cursor.rs b/src/cursor.rs
index 8ab538b..5027e80 100644
--- a/src/cursor.rs
+++ b/src/cursor.rs
@@ -1,3 +1,4 @@
+use mlua::FromLuaMulti;
pub enum CursorMove {
Up(usize),
@@ -12,6 +13,69 @@ pub enum CursorMove {
Relative((isize, isize)),
}
+impl<'lua> FromLuaMulti<'lua> for CursorMove {
+ fn from_lua_multi(
+ values: mlua::prelude::LuaMultiValue<'lua>,
+ _lua: &'lua mlua::prelude::Lua,
+ ) -> mlua::prelude::LuaResult<Self> {
+ let first = values
+ .get(1)
+ .filter(|v| v.is_integer() || v.is_number())
+ .map(|v| {
+ if v.is_number() {
+ v.as_number().unwrap_or(0.0)
+ } else {
+ v.as_number().unwrap_or(0.0)
+ }
+ })
+ .map(|n| n as usize);
+
+ let second = values
+ .get(2)
+ .filter(|v| v.is_integer() || v.is_number())
+ .map(|v| {
+ if v.is_number() {
+ v.as_number().unwrap()
+ } else {
+ v.as_number().unwrap()
+ }
+ })
+ .map(|n| n as usize);
+
+ if let Some(value) = values.get(0) {
+ if value.is_string() {
+ match value.as_str().unwrap().to_lowercase().as_str() {
+ "up" => return Ok(CursorMove::Up(first.unwrap_or(1))),
+ "down" => return Ok(CursorMove::Down(first.unwrap_or(1))),
+ "left" => return Ok(CursorMove::Left(first.unwrap_or(1))),
+ "right" => return Ok(CursorMove::Right(first.unwrap_or(1))),
+ "top" => return Ok(CursorMove::Top),
+ "bottom" => return Ok(CursorMove::Bottom),
+ "begin" => return Ok(CursorMove::Begin),
+ "end" => return Ok(CursorMove::End),
+ "jump" => {
+ if first.is_some() && second.is_some() {
+ return Ok(CursorMove::Jump((first.unwrap(), second.unwrap())));
+ }
+
+ return Err(mlua::Error::runtime("invalid row, column values"));
+ }
+ "relative" => {
+ if first.is_some() && second.is_some() {
+ return Ok(CursorMove::Jump((first.unwrap(), second.unwrap())));
+ }
+
+ return Err(mlua::Error::runtime("invalid row, column values"));
+ }
+ _ => {}
+ }
+ }
+ }
+
+ Err(mlua::Error::runtime("invalid first value"))
+ }
+}
+
#[derive(Default, Debug, Clone)]
pub struct Cursor {
x: isize,
@@ -76,7 +140,7 @@ impl Cursor {
CursorMove::Jump((x, y)) => {
self.x = x as isize;
self.y = y as isize;
- },
+ }
CursorMove::Relative((x, y)) => {
self.x += x;
self.y += y;