Implement echo to current frame + raw echo without CRLF
This commit is contained in:
parent
1738cb1f80
commit
972b7c0cab
@ -11,6 +11,7 @@ fn reentrant_command_handler(
|
||||
command_in: &str,
|
||||
) {
|
||||
echo_to_term_frame(globals, term_frame, "\r").unwrap_or(());
|
||||
lua_state.set_current_frame(term_frame);
|
||||
for command in parse_commands(command_in).commands {
|
||||
match command.split_out_command() {
|
||||
None => (),
|
||||
|
@ -1,5 +1,8 @@
|
||||
use anyhow::Error;
|
||||
use piccolo::{Callback, Closure, Context, Executor, IntoValue, Lua, StashedExecutor, Table};
|
||||
use piccolo::{
|
||||
Callback, Closure, Context, Executor, FromValue, Function, IntoValue, Lua, StashedExecutor,
|
||||
StaticError, Table,
|
||||
};
|
||||
|
||||
use crate::{echo_to_term_frame, GlobalCell, TermFrame};
|
||||
use std::str;
|
||||
@ -18,6 +21,20 @@ impl LuaState {
|
||||
Ok(LuaState { interp, exec })
|
||||
}
|
||||
|
||||
fn try_set_current_frame(&mut self, frame: &TermFrame) -> Result<(), StaticError> {
|
||||
self.interp.try_enter(|ctx| {
|
||||
let info_table = Table::from_value(ctx, ctx.get_global(ctx.intern_static(b"info")))?;
|
||||
info_table.set(ctx, ctx.intern_static(b"current_frame"), frame.0 as i64)?;
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
pub fn set_current_frame(&mut self, frame: &TermFrame) {
|
||||
// We silently ignore errors here. Failure can happen if the Lua code does weird things
|
||||
// like messes with the info global, so better to just ignore.
|
||||
self.try_set_current_frame(frame).unwrap_or(())
|
||||
}
|
||||
|
||||
pub fn execute(&mut self, command: &str) -> Result<(), String> {
|
||||
self.interp
|
||||
.try_enter(|ctx| {
|
||||
@ -40,16 +57,30 @@ pub fn install_lua_globals(global: &GlobalCell) -> Result<(), String> {
|
||||
.interp
|
||||
.try_enter(|ctx| {
|
||||
let cmd_table = Table::new(&ctx);
|
||||
cmd_table
|
||||
.set(
|
||||
ctx,
|
||||
ctx.intern_static(b"echo_frame"),
|
||||
echo_frame(ctx, global.clone()),
|
||||
)
|
||||
.map_err(|_| Error::msg("Can't add command"))?;
|
||||
macro_rules! register_command {
|
||||
($sym: ident) => {
|
||||
cmd_table
|
||||
.set(
|
||||
ctx,
|
||||
ctx.intern_static(stringify!($sym).as_bytes()),
|
||||
$sym(ctx, global.clone()),
|
||||
)
|
||||
.map_err(|_| Error::msg("Can't add command"))?;
|
||||
};
|
||||
}
|
||||
|
||||
register_command!(echo_frame_raw);
|
||||
register_command!(echo_frame);
|
||||
register_command!(echo);
|
||||
ctx.set_global(ctx.intern_static(b"commands").into_value(ctx), cmd_table)
|
||||
.map(|_| ())
|
||||
.map_err(|_| Error::msg("Can't set commands key"))?;
|
||||
|
||||
let info_table = Table::new(&ctx);
|
||||
ctx.set_global(ctx.intern_static(b"info").into_value(ctx), info_table)
|
||||
.map(|_| ())
|
||||
.map_err(|_| Error::msg("Can't set info key"))?;
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.map_err(|e| e.to_string())?;
|
||||
@ -57,7 +88,7 @@ pub fn install_lua_globals(global: &GlobalCell) -> Result<(), String> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn echo_frame(ctx: Context, global: GlobalCell) -> Callback {
|
||||
fn echo_frame_raw(ctx: Context, global: GlobalCell) -> Callback {
|
||||
Callback::from_fn(&ctx, move |ctx, _ex, mut stack| {
|
||||
let frame_no: u64 = stack.from_front(ctx)?;
|
||||
let message: piccolo::String = stack.from_front(ctx)?;
|
||||
@ -68,3 +99,33 @@ fn echo_frame(ctx: Context, global: GlobalCell) -> Callback {
|
||||
Ok(piccolo::CallbackReturn::Return)
|
||||
})
|
||||
}
|
||||
|
||||
fn echo_frame<'gc>(ctx: Context<'gc>, _global: GlobalCell) -> Callback<'gc> {
|
||||
Callback::from_fn(&ctx, move |ctx, _ex, mut stack| {
|
||||
let commands: Table<'gc> =
|
||||
Table::from_value(ctx, ctx.get_global(ctx.intern_static(b"commands")))?;
|
||||
let function = Function::from_value(ctx, commands.get(ctx, "echo_frame_raw"))?;
|
||||
let message: piccolo::Value = stack.from_back(ctx)?;
|
||||
let message = ctx.intern(&format!("{}\r\n", message).as_bytes());
|
||||
stack.push_back(message.into());
|
||||
Ok(piccolo::CallbackReturn::Call {
|
||||
function,
|
||||
then: None,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
fn echo<'gc>(ctx: Context<'gc>, _global: GlobalCell) -> Callback<'gc> {
|
||||
Callback::from_fn(&ctx, move |ctx, _ex, mut stack| {
|
||||
let commands: Table<'gc> =
|
||||
Table::from_value(ctx, ctx.get_global(ctx.intern_static(b"commands")))?;
|
||||
let function = Function::from_value(ctx, commands.get(ctx, "echo_frame"))?;
|
||||
let info: Table<'gc> = Table::from_value(ctx, ctx.get_global(ctx.intern_static(b"info")))?;
|
||||
let cur_frame = info.get(ctx, ctx.intern_static(b"current_frame"));
|
||||
stack.push_front(cur_frame);
|
||||
Ok(piccolo::CallbackReturn::Call {
|
||||
function,
|
||||
then: None,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user