use mlua::{AnyUserData, ExternalError, Lua, Table, UserData, UserDataMethods, Value}; use ratatui::widgets::Widget; use super::{RectRef, Renderable, Span, Style}; #[derive(Clone, Default)] pub struct Gauge { area: ratatui::layout::Rect, ratio: f64, label: Option>, style: Option, gauge_style: Option, } impl Gauge { pub fn install(lua: &Lua, ui: &Table) -> mlua::Result<()> { ui.set( "Gauge", lua.create_function(|_, area: RectRef| Ok(Gauge { area: *area, ..Default::default() }))?, ) } } impl UserData for Gauge { fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_function("percent", |_, (ud, percent): (AnyUserData, u8)| { if percent > 100 { return Err("percent must be between 0 and 100".into_lua_err()); } ud.borrow_mut::()?.ratio = percent as f64 / 100.0; Ok(ud) }); methods.add_function("ratio", |_, (ud, ratio): (AnyUserData, f64)| { if !(0.0..1.0).contains(&ratio) { return Err("ratio must be between 0 and 1".into_lua_err()); } ud.borrow_mut::()?.ratio = ratio; Ok(ud) }); methods.add_function("label", |_, (ud, label): (AnyUserData, Span)| { ud.borrow_mut::()?.label = Some(label.0); Ok(ud) }); methods.add_function("style", |_, (ud, value): (AnyUserData, Value)| { ud.borrow_mut::()?.style = match value { Value::Nil => None, Value::Table(tbl) => Some(Style::from(tbl).0), Value::UserData(ud) => Some(ud.borrow::