forked from trinitrix/core
Fix(handles): Add command handling over the internal event stream
This commit is contained in:
parent
a413171ffe
commit
14333944dc
|
@ -1,4 +1,4 @@
|
||||||
use crate::app::{events::event_types::EventStatus, App, command_interface::Command};
|
use crate::app::{command_interface::Command, events::event_types::EventStatus, App};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use cli_log::info;
|
use cli_log::info;
|
||||||
|
|
||||||
|
@ -32,5 +32,9 @@ pub async fn handle(app: &mut App<'_>, command: &Command) -> Result<EventStatus>
|
||||||
}
|
}
|
||||||
EventStatus::Ok
|
EventStatus::Ok
|
||||||
}
|
}
|
||||||
|
Command::Greet(name) => {
|
||||||
|
info!("Greated {}", name);
|
||||||
|
EventStatus::Ok
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,7 +155,7 @@ pub async fn handle(app: &mut App<'_>, input_event: &CrosstermEvent) -> Result<E
|
||||||
code: KeyCode::Enter,
|
code: KeyCode::Enter,
|
||||||
..
|
..
|
||||||
}) => {
|
}) => {
|
||||||
let cli_event = app.ui
|
let ci_event = app.ui
|
||||||
.cli
|
.cli
|
||||||
.as_mut()
|
.as_mut()
|
||||||
.expect("This is already checked")
|
.expect("This is already checked")
|
||||||
|
@ -165,16 +165,10 @@ pub async fn handle(app: &mut App<'_>, input_event: &CrosstermEvent) -> Result<E
|
||||||
"There can only be one line in the buffer, as we collect it on enter being inputted"
|
"There can only be one line in the buffer, as we collect it on enter being inputted"
|
||||||
)
|
)
|
||||||
.to_owned();
|
.to_owned();
|
||||||
let output = app.handle_ci_event(&cli_event).await?;
|
app.tx
|
||||||
|
.send(Event::LuaCommand(ci_event))
|
||||||
// delete the old text:
|
.await
|
||||||
|
.context("Failed to send lua command to internal event stream")?;
|
||||||
// We can use a mutable borrow now, as we should only need one
|
|
||||||
let cli = app.ui.cli.as_mut().expect("Checked above");
|
|
||||||
cli.move_cursor(tui_textarea::CursorMove::Jump(0, 0));
|
|
||||||
cli.delete_str(0, cli_event.chars().count());
|
|
||||||
assert!(cli.is_empty());
|
|
||||||
cli.insert_str(output);
|
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
app.ui
|
app.ui
|
||||||
|
|
|
@ -3,9 +3,9 @@ mod handlers;
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use crossterm::event::Event as CrosstermEvent;
|
use crossterm::event::Event as CrosstermEvent;
|
||||||
|
|
||||||
use crate::app::{status::State, App, command_interface::Command};
|
use crate::app::{command_interface::Command, status::State, App};
|
||||||
|
|
||||||
use self::handlers::{command, main, matrix, setup};
|
use self::handlers::{ci_output, command, lua_command, main, matrix, setup};
|
||||||
|
|
||||||
use super::EventStatus;
|
use super::EventStatus;
|
||||||
|
|
||||||
|
@ -14,6 +14,8 @@ pub enum Event {
|
||||||
InputEvent(CrosstermEvent),
|
InputEvent(CrosstermEvent),
|
||||||
MatrixEvent(matrix_sdk::deserialized_responses::SyncResponse),
|
MatrixEvent(matrix_sdk::deserialized_responses::SyncResponse),
|
||||||
CommandEvent(Command),
|
CommandEvent(Command),
|
||||||
|
CiOutput(String),
|
||||||
|
LuaCommand(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Event {
|
impl Event {
|
||||||
|
@ -26,6 +28,14 @@ impl Event {
|
||||||
Event::CommandEvent(event) => command::handle(app, event)
|
Event::CommandEvent(event) => command::handle(app, event)
|
||||||
.await
|
.await
|
||||||
.with_context(|| format!("Failed to handle command event: `{:#?}`", event)),
|
.with_context(|| format!("Failed to handle command event: `{:#?}`", event)),
|
||||||
|
Event::CiOutput(output) => ci_output::handle(app, output).await.with_context(|| {
|
||||||
|
format!("Failed to handle command interface output: `{:#?}`", output)
|
||||||
|
}),
|
||||||
|
Event::LuaCommand(lua_code) => {
|
||||||
|
lua_command::handle(app, lua_code).await.with_context(|| {
|
||||||
|
format!("Failed to handle lua code: `{:#?}`", lua_code)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
Event::InputEvent(event) => match app.status.state() {
|
Event::InputEvent(event) => match app.status.state() {
|
||||||
State::None => Ok(EventStatus::Ok),
|
State::None => Ok(EventStatus::Ok),
|
||||||
|
|
|
@ -66,21 +66,6 @@ impl App<'_> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn handle_ci_event(&self, event: &str) -> Result<String> {
|
|
||||||
info!("Recieved ci event: `{event}`; executing..");
|
|
||||||
|
|
||||||
// TODO: Should the ci support more than strings?
|
|
||||||
let output = self.lua.context(|context| -> Result<String> {
|
|
||||||
let output = context
|
|
||||||
.load(&event)
|
|
||||||
.eval::<String>()
|
|
||||||
.with_context(|| format!("Failed to execute: `{event}`"))?;
|
|
||||||
info!("Function evaluated to: `{output}`");
|
|
||||||
Ok(output)
|
|
||||||
})?;
|
|
||||||
Ok(output)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn run(&mut self) -> Result<()> {
|
pub async fn run(&mut self) -> Result<()> {
|
||||||
// Spawn input event listener
|
// Spawn input event listener
|
||||||
tokio::task::spawn(events::poll_input_events(
|
tokio::task::spawn(events::poll_input_events(
|
||||||
|
|
|
@ -2,8 +2,8 @@ pub mod update;
|
||||||
|
|
||||||
use std::io::Stdout;
|
use std::io::Stdout;
|
||||||
|
|
||||||
use anyhow::{bail, Result, Context};
|
use anyhow::{bail, Context, Result};
|
||||||
use cli_log::info;
|
use cli_log::{info, warn};
|
||||||
use crossterm::{
|
use crossterm::{
|
||||||
event::DisableMouseCapture,
|
event::DisableMouseCapture,
|
||||||
execute,
|
execute,
|
||||||
|
@ -125,6 +125,16 @@ impl UI<'_> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_command_output(&mut self, output: &str) {
|
||||||
|
info!("Setting output to: `{}`", output);
|
||||||
|
if let Some(_) = self.cli {
|
||||||
|
let cli = Some(TextArea::from([output]));
|
||||||
|
self.cli = cli;
|
||||||
|
} else {
|
||||||
|
warn!("Failed to set output");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn cli_enable(&mut self) {
|
pub fn cli_enable(&mut self) {
|
||||||
self.input_position = InputPosition::CLI;
|
self.input_position = InputPosition::CLI;
|
||||||
if self.cli.is_some() {
|
if self.cli.is_some() {
|
||||||
|
|
Loading…
Reference in New Issue