use std::any::TypeId; use mlua::{AnyUserData, ExternalError}; use super::{Bar, Border, Clear, Gauge, Line, List, Table, Text}; #[derive(Clone, Debug)] pub enum Renderable { Line(Line), Text(Text), List(Box), Bar(Bar), Clear(Clear), Border(Border), Gauge(Box), Table(Box), } impl Renderable { pub fn render( self, buf: &mut ratatui::buffer::Buffer, trans: impl Fn(yazi_config::popup::Position) -> ratatui::layout::Rect, ) { match self { Self::Line(line) => line.render(buf, trans), Self::Text(text) => text.render(buf, trans), Self::List(list) => list.render(buf, trans), Self::Bar(bar) => bar.render(buf, trans), Self::Clear(clear) => clear.render(buf, trans), Self::Border(border) => border.render(buf, trans), Self::Gauge(gauge) => gauge.render(buf, trans), Self::Table(table) => table.render(buf, trans), } } } impl TryFrom for Renderable { type Error = mlua::Error; fn try_from(ud: AnyUserData) -> Result { Ok(match ud.type_id() { Some(t) if t == TypeId::of::() => Self::Line(ud.take()?), Some(t) if t == TypeId::of::() => Self::Text(ud.take()?), Some(t) if t == TypeId::of::() => Self::List(Box::new(ud.take()?)), Some(t) if t == TypeId::of::() => Self::Bar(ud.take()?), Some(t) if t == TypeId::of::() => Self::Clear(ud.take()?), Some(t) if t == TypeId::of::() => Self::Border(ud.take()?), Some(t) if t == TypeId::of::() => Self::Gauge(Box::new(ud.take()?)), Some(t) if t == TypeId::of::
() => Self::Table(Box::new(ud.take()?)), _ => Err(format!("expected a UserData of renderable element, not: {ud:#?}").into_lua_err())?, }) } }