use std::ops::Deref; use mlua::{ExternalError, FromLua, Lua, Table, UserData, UserDataFields, UserDataMethods, UserDataRef, Value}; use crate::{Cha, Url, impl_file_fields, impl_file_methods}; pub type FileRef = UserDataRef; pub struct File { inner: yazi_fs::File, v_cha: Option, v_url: Option, v_link_to: Option, v_name: Option, } impl Deref for File { type Target = yazi_fs::File; fn deref(&self) -> &Self::Target { &self.inner } } impl From for yazi_fs::File { fn from(value: File) -> Self { value.inner } } impl File { pub fn new(inner: yazi_fs::File) -> Self { Self { inner, v_cha: None, v_url: None, v_link_to: None, v_name: None } } } impl File { pub fn install(lua: &Lua) -> mlua::Result<()> { lua.globals().raw_set( "File", lua.create_function(|_, t: Table| { Ok(Self::new(yazi_fs::File { url: t.raw_get::("url")?.into(), cha: *t.raw_get::("cha")?, ..Default::default() })) })?, ) } } impl FromLua for File { fn from_lua(value: Value, _: &Lua) -> mlua::Result { Ok(match value { Value::UserData(ud) => Self::new(ud.take::()?.inner), _ => Err("Expected a File".into_lua_err())?, }) } } impl UserData for File { fn add_fields>(fields: &mut F) { impl_file_fields!(fields); } fn add_methods>(methods: &mut M) { impl_file_methods!(methods); } }