diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-26 10:32:55 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-26 10:32:55 +0200 |
| commit | 6ca07d6af8a338e76817d06c6c6c6f13e64fba9c (patch) | |
| tree | 32680f0942da8c45af8425ebc20330f5456a9213 /src/config/theme/colorpair.rs | |
| parent | 8b7c56df1940d2ac6e3ece3385464009e46382fa (diff) | |
add neosheetrc support
Diffstat (limited to 'src/config/theme/colorpair.rs')
| -rw-r--r-- | src/config/theme/colorpair.rs | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/config/theme/colorpair.rs b/src/config/theme/colorpair.rs new file mode 100644 index 0000000..77e6af4 --- /dev/null +++ b/src/config/theme/colorpair.rs @@ -0,0 +1,106 @@ +use std::str::FromStr; + +use mlua::{FromLua, IntoLua}; +use ratatui::style::{Color, Styled, Stylize}; + +#[derive(Clone)] +pub struct ColorPair { + pub fg: Color, + pub bg: Color, +} + +impl ColorPair { + pub const fn new(fg: Color, bg: Color) -> Self { + ColorPair { bg, fg } + } + + pub fn apply<S, I>(&self, s: S) -> <I as Styled>::Item + where + S: Styled<Item = I>, + I: Styled, + { + s.bg(self.bg).fg(self.fg) + } +} + +impl<'lua> FromLua<'lua> for ColorPair { + fn from_lua( + value: mlua::prelude::LuaValue<'lua>, + _lua: &'lua mlua::prelude::Lua, + ) -> mlua::prelude::LuaResult<Self> { + if value.is_table() { + let table = value.as_table().unwrap(); + if let Ok(fg) = table.get::<_, LuaColor>(1) { + if let Ok(bg) = table.get::<_, LuaColor>(2) { + return Ok(ColorPair::new(fg.into(), bg.into())); + } + } else if let Ok(fg) = table.get::<_, LuaColor>("fg") { + if let Ok(bg) = table.get::<_, LuaColor>("bg") { + return Ok(ColorPair::new(fg.into(), bg.into())); + } + } + } + + return Err(mlua::Error::runtime("could not parse colorpair")); + } +} + +impl<'lua> IntoLua<'lua> for ColorPair { + fn into_lua( + self, + lua: &'lua mlua::prelude::Lua, + ) -> mlua::prelude::LuaResult<mlua::prelude::LuaValue<'lua>> { + let table = lua.create_table()?; + table.set("fg", LuaColor::from(self.fg))?; + table.set("bg", LuaColor::from(self.bg))?; + Ok(table.into_lua(lua)?) + } +} + +struct LuaColor { + color: Color, +} + +impl LuaColor { + fn new(color: Color) -> Self { + Self { color } + } +} + +impl From<Color> for LuaColor { + fn from(value: Color) -> Self { + LuaColor::new(value) + } +} + +impl Into<Color> for LuaColor { + fn into(self) -> Color { + self.color + } +} + +impl<'lua> FromLua<'lua> for LuaColor { + fn from_lua( + value: mlua::prelude::LuaValue<'lua>, + _lua: &'lua mlua::prelude::Lua, + ) -> mlua::prelude::LuaResult<Self> { + if value.is_string() { + let str = value.as_str().unwrap(); + match Color::from_str(str) { + Ok(color) => Ok(color.into()), + Err(_) => Err(mlua::Error::runtime("color has wrong format")), + } + } else { + Err(mlua::Error::runtime("color has wrong format")) + } + } +} + +impl<'lua> IntoLua<'lua> for LuaColor { + fn into_lua( + self, + lua: &'lua mlua::prelude::Lua, + ) -> mlua::prelude::LuaResult<mlua::prelude::LuaValue<'lua>> { + Ok(self.color.to_string().to_lowercase().into_lua(lua)?) + } +} |