manen

Fancy Lua REPL
Log | Files | Refs | README | LICENSE

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 }