hinter.rs (1986B)
1 use mlua::prelude::*; 2 use nu_ansi_term::{Color, Style}; 3 use reedline::{Hinter, History}; 4 5 use crate::inspect::display_basic; 6 7 fn burner_lua() -> Lua { 8 #[cfg(any(feature = "lua54", feature = "lua53"))] 9 let flags = LuaStdLib::MATH | LuaStdLib::STRING | LuaStdLib::UTF8; 10 #[cfg(not(any(feature = "lua54", feature = "lua53")))] 11 let flags = LuaStdLib::MATH | LuaStdLib::STRING; 12 13 let lua = Lua::new_with(flags, LuaOptions::new()).unwrap(); 14 15 let globals = lua.globals(); 16 globals.raw_remove("print").unwrap(); 17 globals.raw_remove("loadfile").unwrap(); 18 globals.raw_remove("load").unwrap(); 19 20 let math: LuaTable = globals.get("math").unwrap(); 21 math.raw_remove("random").unwrap(); 22 23 lua.set_hook( 24 LuaHookTriggers::new().every_nth_instruction(256), 25 |_lua, _debug| Err(LuaError::runtime("timed out")), 26 ); 27 28 lua 29 } 30 31 pub struct LuaHinter; 32 33 impl Hinter for LuaHinter { 34 fn handle( 35 &mut self, 36 line: &str, 37 _pos: usize, 38 _history: &dyn History, 39 use_ansi_coloring: bool, 40 _cwd: &str, 41 ) -> String { 42 let lua = burner_lua(); 43 44 let value: LuaValue = match lua.load(line).set_name("=").eval() { 45 Ok(value) => value, 46 Err(LuaError::SyntaxError { message, .. }) => { 47 let message = message.split(":").last().unwrap().trim(); 48 let style = Style::new().fg(Color::Red).dimmed(); 49 50 return style.paint(format!(" ({message})")).to_string(); 51 } 52 Err(_) => return String::new(), 53 }; 54 55 if value.is_nil() { 56 return String::new(); 57 } 58 59 let s = format!(" ({})", display_basic(&value, false)); 60 61 if use_ansi_coloring { 62 Color::DarkGray.paint(s).to_string() 63 } else { 64 s 65 } 66 } 67 68 fn complete_hint(&self) -> String { 69 String::new() 70 } 71 72 fn next_hint_token(&self) -> String { 73 String::new() 74 } 75 }