diff --git a/Cargo.lock b/Cargo.lock index 4651b50..95fec29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1127,6 +1127,7 @@ dependencies = [ "test-log", "thiserror", "time", + "tokio", "toml", "tracing", "tracing-error", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index b1a4f98..885ecdf 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -51,6 +51,7 @@ toml = { workspace = true } # Actors actix = { workspace = true } actix-rt = { workspace = true } +tokio = { workspace = true } # boilerplate bon = { workspace = true } diff --git a/crates/cli/src/server/mod.rs b/crates/cli/src/server/mod.rs index dfa5a3a..f4393f1 100644 --- a/crates/cli/src/server/mod.rs +++ b/crates/cli/src/server/mod.rs @@ -20,7 +20,7 @@ use git_next_core::git::RepositoryFactory; use color_eyre::{eyre::Context, Result}; use kxio::{fs::FileSystem, network::Network}; -use tracing::{error, info}; +use tracing::info; use std::{ path::PathBuf, @@ -46,6 +46,7 @@ pub fn init(fs: &FileSystem) -> Result<()> { Ok(()) } +#[allow(clippy::too_many_lines)] pub fn start( ui: bool, fs: FileSystem, @@ -97,7 +98,6 @@ pub fn start( use crate::server::actor::messages::SubscribeToUpdates; use crate::tui; - let (tx_shutdown, rx_shutdown) = channel::(); let tui_addr = tui::Tui::new(tx_shutdown.clone()).start(); server.do_send(SubscribeToUpdates::new(tui_addr.clone().recipient())); server.do_send(ShutdownTrigger::new(tx_shutdown)); @@ -116,18 +116,26 @@ pub fn start( } else { server.do_send(ShutdownTrigger::new(tx_shutdown.clone())); server.do_send(FileUpdated); - info!("Server running - Press Ctrl-C to stop..."); - actix_rt::spawn(async move { - let _ = signal::ctrl_c().await; - info!("Ctrl-C received, shutting down..."); - let _ = tx_shutdown.send(String::new()); - }); - if let Ok(message) = rx_shutdown.try_recv() { - let _ = shutdown_message_holder_exec - .write() - .map(|mut o| o.replace(message)); - } + info!("Server running - Press Ctrl-C to stop..."); + tokio::select! { + _r = signal::ctrl_c() => { + info!("Ctrl-C received, shutting down..."); + } + _x = async move { + loop{ + if let Ok(message) = rx_shutdown.try_recv() { + let _ = shutdown_message_holder_exec + .write() + .map(|mut o| o.replace(message)); + break; + } + actix_rt::task::yield_now().await; + } + } => { + info!("signaled shutdown"); + } + }; } // shutdown @@ -147,10 +155,10 @@ pub fn start( #[cfg(feature = "tui")] if ui { ratatui::restore(); - eprintln!("Server: {err:?}"); } - error!(?err, "server"); - return Err(color_eyre::eyre::eyre!(format!("{err}"))); + if !err.is_empty() { + return Err(color_eyre::eyre::eyre!(format!("{err}"))); + } } // check for error from file watcher thread @@ -159,9 +167,7 @@ pub fn start( #[cfg(feature = "tui")] if ui { ratatui::restore(); - eprintln!("File Watcher: {err:?}"); } - error!(?err, "file watcher"); return Err(color_eyre::eyre::eyre!(format!("{err}"))); }