diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-03 10:30:14 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-03 10:30:14 +0200 |
| commit | cd907dd59a48c2aa9d602aa3fb2f24563994420e (patch) | |
| tree | 33a1d783dc98a09b09fdcaf039bdcee9912dadd5 /src/cursor.rs | |
| parent | eafde55afcdf9dc4c17c6c97c1db472fc9ff9957 (diff) | |
implement into_luamulti for cursor move
Diffstat (limited to 'src/cursor.rs')
| -rw-r--r-- | src/cursor.rs | 66 |
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; |