use mlua::{AnyUserData, ExternalError, IntoLua, Lua, Table, UserData, Value}; use ratatui::widgets::Borders; use super::{RectRef, Renderable, Style}; #[derive(Clone)] pub struct Bar { area: ratatui::layout::Rect, direction: ratatui::widgets::Borders, symbol: String, style: Option, } impl Bar { pub fn install(lua: &Lua, ui: &Table) -> mlua::Result<()> { let new = lua.create_function(|_, (_, area, direction): (Table, RectRef, u8)| { Ok(Self { area: *area, direction: Borders::from_bits_truncate(direction), symbol: Default::default(), style: Default::default(), }) })?; let bar = lua.create_table_from([ // Direction ("NONE", Borders::NONE.bits().into_lua(lua)?), ("TOP", Borders::TOP.bits().into_lua(lua)?), ("RIGHT", Borders::RIGHT.bits().into_lua(lua)?), ("BOTTOM", Borders::BOTTOM.bits().into_lua(lua)?), ("LEFT", Borders::LEFT.bits().into_lua(lua)?), ("ALL", Borders::ALL.bits().into_lua(lua)?), ])?; bar.set_metatable(Some(lua.create_table_from([("__call", new)])?)); ui.set("Bar", bar) } } impl UserData for Bar { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_function("symbol", |_, (ud, symbol): (AnyUserData, String)| { ud.borrow_mut::()?.symbol = symbol; Ok(ud) }); methods.add_function("style", |_, (ud, value): (AnyUserData, Value)| { { let mut me = ud.borrow_mut::()?; match value { Value::Nil => me.style = None, Value::Table(tb) => me.style = Some(Style::from(tb).0), Value::UserData(ud) => me.style = Some(ud.borrow::