summaryrefslogtreecommitdiff
path: root/src/config/theme/colorpair.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/theme/colorpair.rs')
-rw-r--r--src/config/theme/colorpair.rs106
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)?)
+ }
+}