diff --git a/src/command.rs b/src/command.rs index ba17219..d9440fd 100644 --- a/src/command.rs +++ b/src/command.rs @@ -15,11 +15,13 @@ use std::{ pub type CommandRequest = (Arc>, Arc); use crate::App; +#[derive(Debug)] pub enum CommandCompleted { Success(CommandResult), Failure(Vec), } +#[derive(Debug)] pub struct CommandResult { pub status_success: bool, pub stdout: Vec, @@ -84,29 +86,35 @@ pub fn command_event_loop( // } fn run_inner(command_request: CommandRequest) -> Result { - let request = command_request.0.read(); + // Spawn the child + let mut child = { + let request = command_request.0.read(); - let mut command = Command::new(&request.command); - command - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .args(&request.hidden_options); + let mut command = Command::new(&request.command); + command + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .args(&request.hidden_options); - if request.wordsplit { - match shellwords::split(&request.cmdline) { - Ok(a) => { - command.args(a); - } - Err(e) => { - bail!("Argument error: {e:?}"); + if request.wordsplit { + match shellwords::split(&request.cmdline) { + Ok(a) => { + command.args(a); + } + Err(e) => { + bail!("Argument error: {e:?}"); + } } + } else { + // TODO: Avoid cloning here + command.arg(&request.cmdline); } - } else { - // TODO: Avoid cloning here - command.arg(&request.cmdline); - } - let mut child = command.spawn()?; + + std::mem::drop(request); + + command.spawn() + }?; let mut stdin = child.stdin.take().context("Could not take stdin")?; let text_orig_clone = command_request.1.clone(); diff --git a/src/event.rs b/src/event.rs index 31d71f3..7825ddc 100644 --- a/src/event.rs +++ b/src/event.rs @@ -3,6 +3,7 @@ use anyhow::bail; use anyhow::Result; use crossbeam::channel::Sender; +#[derive(Debug)] pub enum EventMessage { CommandCompleted(CommandCompleted), CrosstermEvent(crossterm::event::Event), diff --git a/src/main.rs b/src/main.rs index 2b4e14e..082e928 100644 --- a/src/main.rs +++ b/src/main.rs @@ -273,18 +273,19 @@ fn init_message_passing() -> (Receiver, Sender) { let _result = command::command_event_loop(command_request_rx, command_message_tx); }); + // Drop the remaining transmitter std::mem::drop(message_tx); (message_rx, command_request_tx) } fn run_app(terminal: &mut Terminal, app: App) -> Result)>> { + // When starting the app, ensure the command runs at least once { let mut command_options = app.command_options.write(); if !command_options.cmdline.is_empty() { app.run_command()?; - // command_request_tx.send((app.command_options.clone(), app.text_orig.clone()))?; } if command_options.cmdline_position == 0 {