From fb2d79c35c51f37035d4156a95d55a4d708119e0 Mon Sep 17 00:00:00 2001 From: rhpidfyre Date: Fri, 10 Jan 2025 22:24:24 -0500 Subject: [PATCH] Terminal userdata --- src/rc.rs | 5 +- src/vm/mod.rs | 5 +- src/vm/shell.rs | 13 ++--- src/vm/terminal.rs | 141 ++++++++++++++++++++------------------------- 4 files changed, 74 insertions(+), 90 deletions(-) diff --git a/src/rc.rs b/src/rc.rs index 0a355d1..a938c51 100644 --- a/src/rc.rs +++ b/src/rc.rs @@ -6,9 +6,12 @@ use crate::MapDisplay; pub const DEFAULT_CONFIG_CONTENT: &str = r#"--!strict local cyan = TERMINAL.OUT.FOREGROUND.CYAN +local red = TERMINAL.OUT.FOREGROUND.RED -local username = cyan(SHELL.SYSTEM.USERNAME) local hostname = SHELL.SYSTEM.HOSTNAME +local username = SHELL.SYSTEM.USERNAME + +username = if username == "root" then red(username) else cyan(username) SHELL.PROMPT = `{username}@{hostname} λ `"#; diff --git a/src/vm/mod.rs b/src/vm/mod.rs index c464351..0583821 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -1,10 +1,11 @@ use mlua::{Function, Lua as Luau, MultiValue, Result as lResult, Table, Value}; use color_print::{cformat, ceprintln}; +use terminal::TerminalGlobal; use std::{cell::RefCell, rc::Rc}; use core::fmt; -use shell::Shell; +use shell::ShellGlobal; -use crate::{ps::Ps, vm::terminal::Terminal, MapDisplay}; +use crate::{ps::Ps, MapDisplay}; mod shell; mod terminal; diff --git a/src/vm/shell.rs b/src/vm/shell.rs index 5a3b72c..b403cf0 100644 --- a/src/vm/shell.rs +++ b/src/vm/shell.rs @@ -19,8 +19,8 @@ fn luau_sys_details(luau: &Luau) -> lResult { Ok(system) } -struct ShellUserdata(Rc>); -impl UserData for ShellUserdata { +struct Shell(Rc>); +impl UserData for Shell { fn add_fields>(fields: &mut F) { fields.add_field_method_get("PROMPT", |_, this| Ok(this.0.borrow().get().to_owned())); fields.add_field_method_get("SYSTEM", |luau, _| luau_sys_details(luau)); @@ -36,15 +36,12 @@ impl UserData for ShellUserdata { } } -pub trait Shell { +pub trait ShellGlobal { fn global_shell(&self, luau_globals: &Table) -> lResult<()>; } -impl Shell for LuauVm { +impl ShellGlobal for LuauVm { fn global_shell(&self, luau_globals: &Table) -> lResult<()> { - // let shell = self.vm.create_table()?; - // shell.set("SYSTEM", self.sys_details()?)?; - // shell.set("PROMPT", self.ps_prompt()?)?; - luau_globals.set("SHELL", ShellUserdata(Rc::clone(&self.ps)))?; + luau_globals.set("SHELL", Shell(Rc::clone(&self.ps)))?; Ok(()) } } \ No newline at end of file diff --git a/src/vm/terminal.rs b/src/vm/terminal.rs index e11c14c..7ad38a4 100644 --- a/src/vm/terminal.rs +++ b/src/vm/terminal.rs @@ -1,110 +1,93 @@ -use mlua::{Function, Result as lResult, Table}; +use mlua::{UserDataFields, Lua as Luau, Result as lResult, Table, UserData}; use const_format::str_split; use crossterm::style::Stylize; use crate::vm::LuauVm; macro_rules! foreground_styles_luau { - ($self:expr, $style_table:expr, $($color:ident)+) => { + ($luau:expr, $style_table:expr, $($color:ident)+) => { $( - $style_table.raw_set(stringify!($color).to_ascii_uppercase(), $self.vm.create_function(|_, text: String| -> lResult { + $style_table.raw_set(stringify!($color).to_ascii_uppercase(), $luau.create_function(|_, text: String| -> lResult { Ok(text.$color().to_string()) })?)?; )+ }; } macro_rules! background_styles_luau { - ($self:expr, $style_table:expr, $($color:ident)+) => { + ($luau:expr, $style_table:expr, $($color:ident)+) => { $( $style_table.raw_set( str_split!(stringify!($color), "_")[1..].join("_").to_ascii_uppercase(), - $self.vm.create_function(|_, text: String| -> lResult { + $luau.create_function(|_, text: String| -> lResult { Ok(text.$color().to_string()) })?)?; )+ }; } -trait Colors { - fn background(&self, term_out_table: &Table) -> lResult<()>; - fn foreground(&self, term_out_table: &Table) -> lResult<()>; -} -impl Colors for LuauVm { - fn background(&self, term_out_table: &Table) -> lResult<()> { - let foreground_table = self.vm.create_table()?; - foreground_styles_luau!(self, foreground_table, - dark_grey dark_red dark_green dark_cyan - dark_yellow dark_magenta dark_blue - red grey black green yellow - blue magenta cyan white - underlined - underline_dark_grey underline_dark_red underline_dark_green underline_dark_cyan - underline_dark_yellow underline_dark_magenta underline_dark_blue underline_red - underline_grey underline_black underline_green underline_yellow - underline_blue underline_magenta underline_cyan underline_white - bold - ); - term_out_table.raw_set("FOREGROUND", foreground_table) - } - - fn foreground(&self, term_out_table: &Table) -> lResult<()> { - let background_table = self.vm.create_table()?; - background_styles_luau!(self, background_table, - on_dark_grey on_dark_red on_dark_green on_dark_cyan - on_dark_yellow on_dark_magenta on_dark_blue - on_red on_grey on_black - on_green on_yellow - on_blue on_magenta - on_cyan on_white - ); - term_out_table.raw_set("BACKGROUND", background_table) - } +fn text_styles_funcs(luau: &Luau) -> lResult<(Table, Table)> { + let foreground_table = luau.create_table()?; + let background_table = luau.create_table()?; + foreground_styles_luau!(luau, foreground_table, + dark_grey dark_red dark_green dark_cyan + dark_yellow dark_magenta dark_blue + red grey black green yellow + blue magenta cyan white + underlined + underline_dark_grey underline_dark_red underline_dark_green underline_dark_cyan + underline_dark_yellow underline_dark_magenta underline_dark_blue underline_red + underline_grey underline_black underline_green underline_yellow + underline_blue underline_magenta underline_cyan underline_white + bold + ); + background_styles_luau!(luau, background_table, + on_dark_grey on_dark_red on_dark_green on_dark_cyan + on_dark_yellow on_dark_magenta on_dark_blue + on_red on_grey on_black + on_green on_yellow + on_blue on_magenta + on_cyan on_white + ); + Ok((foreground_table, background_table)) } -trait Write { - fn write(&self) -> lResult; - fn write_error(&self) -> lResult; - fn write_error_ln(&self) -> lResult; -} -impl Write for LuauVm { - fn write(&self) -> lResult { - self.vm.create_function(|_, s: String| -> lResult<()> { - print!("{s}"); - Ok(()) - }) - } - fn write_error(&self) -> lResult { - self.vm.create_function(|_, s: String| -> lResult<()> { - eprint!("{s}"); - Ok(()) - }) - } - fn write_error_ln(&self) -> lResult { - self.vm.create_function(|_, s: String| -> lResult<()> { - eprintln!("{s}"); - Ok(()) - }) - } +fn fields_write_funcs>(fields: &mut F) { + fields.add_field_method_get("WRITE", |luau, _| luau.create_function(|_, s: String| -> lResult<()> { + print!("{s}"); + Ok(()) + })); + fields.add_field_method_get("WRITE_ERROR", |luau, _| luau.create_function(|_, s: String| -> lResult<()> { + eprint!("{s}"); + Ok(()) + })); + fields.add_field_method_get("WRITE_ERROR_LN", |luau, _| luau.create_function(|_, s: String| -> lResult<()> { + eprintln!("{s}"); + Ok(()) + })); } -pub trait Terminal { - fn out(&self) -> lResult
; +struct Terminal; +impl UserData for Terminal { + fn add_fields>(fields: &mut F) { + fields_write_funcs(fields); + fields.add_field_method_get("OUT", |luau, _| { + let (foreground, background) = text_styles_funcs(luau)?; + let out_table = luau.create_table()?; + out_table.raw_set("FOREGROUND", foreground)?; + out_table.raw_set("BACKGROUND", background)?; + Ok(out_table) + }); + } + // fn add_methods>(methods: &mut M) { + + // } +} + +pub trait TerminalGlobal { fn global_terminal(&self, luau_globals: &Table) -> lResult<()>; } -impl Terminal for LuauVm { - fn out(&self) -> lResult
{ - let term_out_table = self.vm.create_table()?; - self.background(&term_out_table)?; - self.foreground(&term_out_table)?; - Ok(term_out_table) - } - +impl TerminalGlobal for LuauVm { fn global_terminal(&self, luau_globals: &Table) -> lResult<()> { - let term_table = self.vm.create_table()?; - term_table.raw_set("OUT", self.out()?)?; - term_table.raw_set("WRITE", self.write()?)?; - term_table.raw_set("WRITE_ERROR", self.write_error()?)?; - term_table.raw_set("WRITE_ERROR_LN", self.write_error_ln()?)?; - luau_globals.raw_set("TERMINAL", term_table) + luau_globals.raw_set("TERMINAL", Terminal) } } \ No newline at end of file