From 77ed43290cf17243cdb329145a0b9868e56c9636 Mon Sep 17 00:00:00 2001 From: Prometheus1400 Date: Sun, 7 Dec 2025 13:19:50 -0800 Subject: [PATCH 1/2] switch to color-eyre --- Cargo.lock | 123 ++++++++++++++++++++++++- Cargo.toml | 2 +- cli/Cargo.toml | 2 +- cli/src/app.rs | 34 +++---- cli/src/error.rs | 91 ------------------ cli/src/main.rs | 14 +-- cli/src/prelude.rs | 4 +- cli/src/tasks/lua.rs | 10 +- cli/src/ui/fuzzy_selector_widget.rs | 3 +- core/Cargo.toml | 2 +- daemon/Cargo.toml | 8 +- daemon/src/actors/client_connection.rs | 7 +- daemon/src/actors/pty.rs | 14 +-- daemon/src/actors/session.rs | 1 - daemon/src/actors/session_manager.rs | 6 +- daemon/src/actors/window.rs | 2 +- daemon/src/daemon.rs | 6 +- daemon/src/error.rs | 89 ------------------ daemon/src/main.rs | 2 +- daemon/src/prelude.rs | 5 +- 20 files changed, 179 insertions(+), 246 deletions(-) delete mode 100644 cli/src/error.rs delete mode 100644 daemon/src/error.rs diff --git a/Cargo.lock b/Cargo.lock index fd381e0..dc8a72c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "aho-corasick" version = "1.1.4" @@ -79,6 +94,21 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + [[package]] name = "bincode" version = "2.0.1" @@ -201,6 +231,33 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +[[package]] +name = "color-eyre" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "colorchoice" version = "1.0.4" @@ -424,6 +481,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "find-msvc-tools" version = "0.1.5" @@ -510,6 +577,12 @@ dependencies = [ "wasip2", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "handle-macro" version = "0.1.0" @@ -544,6 +617,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + [[package]] name = "indoc" version = "2.0.7" @@ -694,6 +773,15 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "1.1.0" @@ -775,6 +863,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -796,6 +893,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "owo-colors" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" + [[package]] name = "parking_lot" version = "0.12.5" @@ -974,6 +1077,7 @@ version = "0.1.0" dependencies = [ "bytes", "clap", + "color-eyre", "crossterm 0.29.0", "derivative", "futures-util", @@ -984,7 +1088,6 @@ dependencies = [ "remux-core", "serde", "terminput", - "thiserror 2.0.17", "tokio", "tracing", "tracing-appender", @@ -1013,6 +1116,7 @@ name = "remux-daemon" version = "0.1.0" dependencies = [ "bytes", + "color-eyre", "crossterm 0.29.0", "handle-macro", "itertools 0.14.0", @@ -1021,13 +1125,18 @@ dependencies = [ "rand", "remux-core", "serde", - "thiserror 2.0.17", "tokio", "tracing", "tracing-subscriber", "vt100", ] +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + [[package]] name = "rustc-hash" version = "2.1.1" @@ -1415,6 +1524,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-error" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +dependencies = [ + "tracing", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index eb3c191..be72f64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,9 +13,9 @@ itertools = { version = "0.14" } futures-util = { version = "0.3" } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0.145" } -thiserror = { version = "2.0.17" } tokio = { version = "1.48", features = ["full"] } tracing = { version = "0.1" } tracing-appender = { version = "0.2" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } vt100 = { version = "0" } +color-eyre = { version = "0.6" } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index e6b083e..521bc2b 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -12,12 +12,12 @@ bytes.workspace = true crossterm.workspace = true futures-util.workspace = true serde.workspace = true -thiserror.workspace = true tokio.workspace = true tracing-appender.workspace = true tracing-subscriber.workspace = true tracing.workspace = true vt100.workspace = true +color-eyre.workspace = true clap = { version = "4.5.51", features = ["derive"] } mlua = { version = "0.11.4", features = ["lua54", "serde", "async", "vendored", "send"] } diff --git a/cli/src/app.rs b/cli/src/app.rs index 4bf5b1f..5e8a5ef 100644 --- a/cli/src/app.rs +++ b/cli/src/app.rs @@ -137,7 +137,7 @@ impl App { debug!("Entered alternate screen"); // need an initial render since ui updates app state to convey terminal size information - term.draw(|f| ui::draw(f, &mut self.state)).unwrap(); + term.draw(|f| ui::draw(f, &mut self.state))?; loop { if self.state.terminal.needs_resize { let (rows, cols) = self.state.terminal.size; @@ -145,9 +145,7 @@ impl App { self.state.terminal.emulator.set_size(rows, cols); self.state.terminal.needs_resize = false; let (rows, cols) = self.state.terminal.size; - comm::send_event(&mut self.stream, CliEvent::TerminalResize { rows, cols }) - .await - .unwrap(); + comm::send_event(&mut self.stream, CliEvent::TerminalResize { rows, cols }).await?; } tokio::select! { Some(input) = input_rx.recv() => { @@ -203,7 +201,7 @@ impl App { } } _ = ticker.tick() => { - term.draw(|f| ui::draw(f, &mut self.state)).unwrap(); + term.draw(|f| ui::draw(f, &mut self.state))?; } } } @@ -218,15 +216,19 @@ impl App { } #[instrument(skip(self, bytes))] - async fn dispatch_stdin(&mut self, bytes: Bytes) { + async fn dispatch_stdin(&mut self, bytes: Bytes) -> Result<()> { match self.state.mode { - AppMode::Normal => self.handle_stdin_for_normal_mode(bytes).await, - AppMode::SelectingSession => self.handle_stdin_for_selecting_mode(bytes).await, + AppMode::Normal => self.handle_stdin_for_normal_mode(bytes).await?, + AppMode::SelectingSession => self.handle_stdin_for_selecting_mode(bytes).await?, } + + Ok(()) } - async fn handle_stdin_for_selecting_mode(&mut self, bytes: Bytes) { - let event = Event::parse_from(&bytes).unwrap().unwrap(); + async fn handle_stdin_for_selecting_mode(&mut self, bytes: Bytes) -> Result<()> { + let event = Event::parse_from(&bytes)?.unwrap(); + panic!("hi"); + let selection_opt = match self.state.ui.selector.selector_type { SelectorType::Basic => BasicSelectorWidget::input(event, &mut self.state.ui.selector), SelectorType::Fuzzy => FuzzySelectorWidget::input(event, &mut self.state.ui.selector), @@ -235,10 +237,8 @@ impl App { match selection { ui::traits::Selection::Index(i) => match self.state.mode { AppMode::SelectingSession => { - let session = self.state.ui.selector.list[i].parse::().unwrap(); - comm::send_event(&mut self.stream, CliEvent::SwitchSession(session)) - .await - .unwrap(); + let session = self.state.daemon.session_ids[i]; + comm::send_event(&mut self.stream, CliEvent::SwitchSession(session)).await?; } AppMode::Normal => {} }, @@ -248,9 +248,10 @@ impl App { self.state.ui.selector.list_state.select(Some(0)); self.state.ui.selector.list.clear(); } + Ok(()) } - async fn handle_stdin_for_normal_mode(&mut self, bytes: Bytes) { + async fn handle_stdin_for_normal_mode(&mut self, bytes: Bytes) -> Result<()> { for parsed_event in self.input_parser.process(&bytes) { match parsed_event { input_parser::ParsedEvent::LocalAction(action) => { @@ -258,10 +259,11 @@ impl App { } input_parser::ParsedEvent::DaemonAction(cli_event) => { debug!("sending cli event: {cli_event:?}"); - comm::send_event(&mut self.stream, cli_event).await.unwrap(); + comm::send_event(&mut self.stream, cli_event).await?; } } } + Ok(()) } async fn dispatch_action(&mut self, action: input_parser::Action) { diff --git a/cli/src/error.rs b/cli/src/error.rs deleted file mode 100644 index 76657ec..0000000 --- a/cli/src/error.rs +++ /dev/null @@ -1,91 +0,0 @@ -use bytes::Bytes; -use thiserror::Error; -use tokio::sync::mpsc::error::SendError; - -// use crate::actors::{client::ClientEvent, lua::LuaEvent, ui::UIEvent}; - -pub type Result = std::result::Result; - -#[derive(Error, Debug)] -pub enum Error { - #[error("Custom Error: {0}")] - Custom(String), - - #[error("Error using remux lib: {0}")] - Lib(#[from] remux_core::error::Error), - - #[error("Error initializing logger: {0}")] - Logger(#[from] tracing::subscriber::SetGlobalDefaultError), - - #[error("Error joining tokio tasks: {0}")] - Join(#[from] tokio::task::JoinError), - - #[error("IO Error: {0}")] - IO(#[from] std::io::Error), - - #[error("Error connecting to socket {socket_path}: {source}")] - ConnectingSocket { - socket_path: String, - source: std::io::Error, - }, - - #[error("Error sending message {message:?}: {source}")] - SendRequestMessage { - message: String, - source: remux_core::error::Error, - }, - - #[error("Lua error: {0}")] - Lua(String), - // #[error("Event Send Error: {0}")] - // EventSend(EventSendError), - - // #[error("Sync Send Error: {0}")] - // SyncSend(#[from] std::sync::mpsc::SendError), -} - -impl From for Error { - fn from(e: mlua::Error) -> Self { - Error::Lua(e.to_string()) - } -} - -// #[derive(Error, Debug)] -// pub enum EventSendError { -// #[error("IO send error: {0}")] -// IO(SendError), -// #[error("UI send error: {0}")] -// UI(SendError), -// #[error("Bytes send error: {0}")] -// Bytes(SendError), -// // #[error("WidgetRunner send error: {0}")] -// // WidgetRunner(SendError), -// // #[error("LuaActor send error: {0}")] -// // LuaActor(SendError), -// } -// -// impl From> for Error { -// fn from(e: SendError) -> Self { -// Self::EventSend(EventSendError::IO(e)) -// } -// } -// impl From> for Error { -// fn from(e: SendError) -> Self { -// Self::EventSend(EventSendError::UI(e)) -// } -// } -// impl From> for Error { -// fn from(e: SendError) -> Self { -// Self::EventSend(EventSendError::Bytes(e)) -// } -// } -// // impl From> for Error { -// // fn from(e: SendError) -> Self { -// // Self::EventSend(EventSendError::WidgetRunner(e)) -// // } -// // } -// // impl From> for Error { -// // fn from(e: SendError) -> Self { -// // Self::EventSend(EventSendError::LuaActor(e)) -// // } -// // } diff --git a/cli/src/main.rs b/cli/src/main.rs index 2d85c22..1c8c38f 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,6 +1,5 @@ mod app; mod args; -mod error; mod input_parser; mod prelude; mod states; @@ -24,14 +23,13 @@ use tokio::net::UnixStream; use crate::{ app::App, args::{Args, Commands}, - error::{Error, Result}, prelude::*, }; #[tokio::main] async fn main() { + color_eyre::install().unwrap(); let cli = Args::parse(); - match setup_logging() { Ok(_guard) => { if let Err(e) = run(cli.command).await { @@ -54,7 +52,7 @@ fn setup_logging() -> Result { use tracing_appender::non_blocking; use tracing_subscriber::{EnvFilter, fmt}; - let file = File::create("./logs/remux-cli.log").unwrap(); + let file = File::create("./logs/remux-cli.log")?; let (non_blocking, guard) = non_blocking(file); let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("debug")); let subscriber = fmt().with_writer(non_blocking).with_env_filter(env_filter).finish(); @@ -66,12 +64,8 @@ fn setup_logging() -> Result { async fn connect() -> Result { let socket_path = get_sock_path()?; debug!("Connecting to {:?}", socket_path); - UnixStream::connect(socket_path.clone()) - .await - .map_err(|source| Error::ConnectingSocket { - socket_path: socket_path.to_string_lossy().into_owned(), - source, - }) + let stream = UnixStream::connect(socket_path.clone()).await?; + Ok(stream) } #[instrument] diff --git a/cli/src/prelude.rs b/cli/src/prelude.rs index 9c519f1..54c9d81 100644 --- a/cli/src/prelude.rs +++ b/cli/src/prelude.rs @@ -3,6 +3,6 @@ use tokio::task::JoinHandle; pub use tracing::{debug, error, info, instrument, trace, warn}; -pub use crate::error::{Error, Result}; - pub type CliTask = JoinHandle>; + +pub use color_eyre::eyre::{Error, Result}; diff --git a/cli/src/tasks/lua.rs b/cli/src/tasks/lua.rs index f9e7d0a..fa91043 100644 --- a/cli/src/tasks/lua.rs +++ b/cli/src/tasks/lua.rs @@ -1,5 +1,6 @@ use std::{fs, time::Duration}; +use color_eyre::eyre; use mlua::Lua; use tokio::sync::broadcast; @@ -23,10 +24,10 @@ fn initialize_lua_state(lua: &mut Lua) -> Result<()> { Ok(()) } -pub fn start_status_line_task(tx: broadcast::Sender) -> CliTask { +pub fn start_status_line_task(tx: broadcast::Sender) -> Result { let mut lua = Lua::default(); - initialize_lua_state(&mut lua).unwrap(); - let code = fs::read_to_string("defaults/statusbar.lua").unwrap(); + initialize_lua_state(&mut lua)?; + let code = fs::read_to_string("defaults/statusbar.lua")?; info!("Starting lua status line task"); let task: CliTask = tokio::spawn({ @@ -84,9 +85,8 @@ pub fn start_status_line_task(tx: broadcast::Sender) -> CliTask } let _ = tx.send(status_line_state); } - // Ok::<(), Error>(()) } }); - task + eyre::Ok(task) } diff --git a/cli/src/ui/fuzzy_selector_widget.rs b/cli/src/ui/fuzzy_selector_widget.rs index e1831aa..fb3c13e 100644 --- a/cli/src/ui/fuzzy_selector_widget.rs +++ b/cli/src/ui/fuzzy_selector_widget.rs @@ -102,8 +102,7 @@ impl SelectorStatefulWidget for FuzzySelectorWidget { // Map the current filtered index to the original index let original_index = selected_index .and_then(|i| filtered_list.get(i)) - .map(|item| item.index) - .unwrap(); + .map(|item| item.index)?; Some(Selection::Index(original_index)) } diff --git a/core/Cargo.toml b/core/Cargo.toml index 4ba58ff..e61e355 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -9,9 +9,9 @@ bytes.workspace = true derive_more.workspace = true serde_json.workspace = true serde.workspace = true -thiserror.workspace = true tokio.workspace = true bincode = "2.0.1" fs2 = "0.4.3" rand = "0.9.2" +thiserror = "2.0" diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index 6bc9838..d964d9f 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -1,3 +1,9 @@ +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" + [package] name = "remux-daemon" version = "0.1.0" @@ -13,11 +19,11 @@ bytes.workspace = true crossterm.workspace = true itertools.workspace = true serde.workspace = true -thiserror.workspace = true tokio.workspace = true tracing-subscriber.workspace = true tracing.workspace = true vt100.workspace = true +color-eyre.workspace = true nix = { version = "0.30.1", features = ["term", "process", "signal"] } pty = "0.2.2" diff --git a/daemon/src/actors/client_connection.rs b/daemon/src/actors/client_connection.rs index 9640866..6e81fd9 100644 --- a/daemon/src/actors/client_connection.rs +++ b/daemon/src/actors/client_connection.rs @@ -72,7 +72,7 @@ impl ClientConnection { } } #[instrument(skip(self), fields(client_id = self.id))] - fn run(mut self, initial_session_id: u32) -> crate::error::Result { + fn run(mut self, initial_session_id: u32) -> Result { let span = tracing::Span::current(); let handle_clone = self.handle.clone(); @@ -99,11 +99,6 @@ impl ClientConnection { } } } - // AttachToSession(session_id) => { - // debug!("Client: AttachToSession"); - // self.session_manager_handle.client_connect(self.id, handle.clone(), session_id, true).await.unwrap(); - // self.state = ClientConnectionState::Attaching; - // } SuccessAttachToSession(session_id) => { debug!("Client: SuccessAttachToSession"); self.state = ClientConnectionState::Attached; diff --git a/daemon/src/actors/pty.rs b/daemon/src/actors/pty.rs index f6a77be..833d25e 100644 --- a/daemon/src/actors/pty.rs +++ b/daemon/src/actors/pty.rs @@ -4,6 +4,7 @@ use std::{ }; use bytes::Bytes; +use color_eyre::eyre; use handle_macro::Handle; use nix::{ errno::Errno, @@ -111,8 +112,8 @@ impl Pty { Ok(_) => trace!("wrote 0 bytes to pty"), Err(e) => error!("error writing to pty: {}", e), }; - Ok(()) - }).map_err(|_e| Error::Custom("failed to write to master fd".to_owned()))?; + std::result::Result::Ok(()) + }); }, None => { // None means sender closed the channel - and we need to @@ -174,9 +175,8 @@ impl Pty { } fn handle_input(&mut self, bytes: Bytes) -> Result<()> { - self.pty_tx - .send(bytes) - .map_err(|_| Error::Custom("error sending to pty_tx".to_owned())) + self.pty_tx.send(bytes)?; + Ok(()) } fn handle_kill(child: Pid) -> Result<()> { @@ -207,11 +207,11 @@ fn set_fd_nonblocking(owned_fd: &OwnedFd) -> Result<()> { let fd = owned_fd.as_raw_fd(); let flags = unsafe { fcntl(fd, F_GETFL) }; if flags < 0 { - return Err(Error::Custom("flag error".into())); + return Err(eyre::eyre!("flag error")); } let res = unsafe { fcntl(fd, F_SETFL, flags | O_NONBLOCK) }; if res < 0 { - Err(Error::Custom("fcntl error".into())) + Err(eyre::eyre!("fcntl error")) } else { Ok(()) } diff --git a/daemon/src/actors/session.rs b/daemon/src/actors/session.rs index fa1553f..74999c7 100644 --- a/daemon/src/actors/session.rs +++ b/daemon/src/actors/session.rs @@ -8,7 +8,6 @@ use crate::{ session_manager::SessionManagerHandle, window::{Window, WindowHandle}, }, - error::Result, layout::SplitDirection, prelude::*, }; diff --git a/daemon/src/actors/session_manager.rs b/daemon/src/actors/session_manager.rs index 607d8d4..38326bb 100644 --- a/daemon/src/actors/session_manager.rs +++ b/daemon/src/actors/session_manager.rs @@ -1,6 +1,7 @@ use std::{collections::HashMap, vec}; use bytes::Bytes; +use color_eyre::eyre; use handle_macro::Handle; use remux_core::states::DaemonState; use tokio::sync::mpsc; @@ -11,7 +12,6 @@ use crate::{ client_connection::ClientConnectionHandle, session::{Session, SessionHandle}, }, - error::Result, layout::SplitDirection, prelude::*, }; @@ -91,7 +91,7 @@ impl SessionManager { } #[instrument(skip(self))] - fn run(mut self) -> crate::error::Result { + fn run(mut self) -> Result { let span = tracing::Span::current(); let handle_clone = self.handle.clone(); let _task = tokio::spawn({ @@ -170,7 +170,7 @@ impl SessionManager { // session doesn't exist and client not trying to create it if !self.sessions.contains_key(&session_id) && !create_session { client_handle - .initial_attach_result(Err(Error::Custom("no such session".to_owned()))) + .initial_attach_result(Err(eyre::eyre!("no such session"))) .await?; return Ok(()); } diff --git a/daemon/src/actors/window.rs b/daemon/src/actors/window.rs index b3d5463..ce11ec6 100644 --- a/daemon/src/actors/window.rs +++ b/daemon/src/actors/window.rs @@ -253,7 +253,7 @@ impl Window { }) } #[instrument(skip(self))] - fn run(mut self) -> crate::error::Result { + fn run(mut self) -> Result { let span = tracing::Span::current(); let handle_clone = self.handle.clone(); let _task = tokio::spawn({ diff --git a/daemon/src/daemon.rs b/daemon/src/daemon.rs index 8e6e6c3..d6aaf46 100644 --- a/daemon/src/daemon.rs +++ b/daemon/src/daemon.rs @@ -11,7 +11,6 @@ use crate::{ client_connection::ClientConnection, session_manager::{SessionManager, SessionManagerHandle}, }, - error::Result, prelude::*, }; @@ -24,7 +23,7 @@ impl RemuxDaemon { /// Makes sure there can only ever be once instance at the /// process level through use of OS level file locks pub fn new() -> Result { - let session_manager_handle = SessionManager::spawn().unwrap(); + let session_manager_handle = SessionManager::spawn()?; Ok(Self { _daemon_file: lock_daemon_file()?, session_manager_handle, @@ -60,8 +59,7 @@ async fn handle_message(session_manager_handle: SessionManagerHandle, mut stream match req.body { DaemonRequestMessageBody::Attach(request::Attach { session_id, create }) => { debug!("running new client actor"); - let _client = ClientConnection::spawn(stream, session_manager_handle, session_id).unwrap(); - // client.attach_to_session(session_id).await.unwrap(); + let _client = ClientConnection::spawn(stream, session_manager_handle, session_id)?; } }; Ok(()) diff --git a/daemon/src/error.rs b/daemon/src/error.rs deleted file mode 100644 index 480d7a1..0000000 --- a/daemon/src/error.rs +++ /dev/null @@ -1,89 +0,0 @@ -use thiserror::Error; -use tokio::sync::mpsc::error::SendError; - -use crate::actors::{ - client_connection::ClientConnectionEvent, pane::PaneEvent, pty::PtyEvent, session::SessionEvent, - session_manager::SessionManagerEvent, window::WindowEvent, -}; - -pub type Result = std::result::Result; - -#[derive(Error, Debug)] -pub enum Error { - #[error("Error: {0}")] - Custom(String), - - #[error("Cannot spawn another remux daemon: {0}")] - DuplicateProcess(#[from] remux_core::error::Error), - - #[error("IO Error: {0}")] - IO(#[from] std::io::Error), - - #[error("Error initializing logger: {0}")] - Logger(#[from] tracing::subscriber::SetGlobalDefaultError), - - #[error("PTY Error: {0}")] - Pty(#[from] pty::fork::ForkError), - - #[error("Master Error: {0}")] - Nix(#[from] nix::Error), - - #[error("Master Error: {0}")] - Master(#[from] pty::fork::MasterError), - - #[error("Slave Error: {0}")] - Slave(#[from] pty::fork::SlaveError), - - #[error("Join Error: {0}")] - Join(#[from] tokio::task::JoinError), - - #[error("Event Send Error: {0}")] - EventSend(EventSendError), -} - -#[derive(Error, Debug)] -pub enum EventSendError { - #[error("Client send error: {0}")] - Client(Box>), - #[error("Session Manager send error: {0}")] - SessionManager(SendError), - #[error("Session send error: {0}")] - Session(SendError), - #[error("Window send error: {0}")] - Window(SendError), - #[error("Pane send error: {0}")] - Pane(SendError), - #[error("Pty send error: {0}")] - Pty(SendError), -} - -impl From> for Error { - fn from(e: SendError) -> Self { - Self::EventSend(EventSendError::Client(Box::new(e))) - } -} -impl From> for Error { - fn from(e: SendError) -> Self { - Self::EventSend(EventSendError::SessionManager(e)) - } -} -impl From> for Error { - fn from(e: SendError) -> Self { - Self::EventSend(EventSendError::Session(e)) - } -} -impl From> for Error { - fn from(e: SendError) -> Self { - Self::EventSend(EventSendError::Window(e)) - } -} -impl From> for Error { - fn from(e: SendError) -> Self { - Self::EventSend(EventSendError::Pane(e)) - } -} -impl From> for Error { - fn from(e: SendError) -> Self { - Self::EventSend(EventSendError::Pty(e)) - } -} diff --git a/daemon/src/main.rs b/daemon/src/main.rs index ddea33e..426106c 100644 --- a/daemon/src/main.rs +++ b/daemon/src/main.rs @@ -1,7 +1,6 @@ mod actors; mod control_signals; mod daemon; -mod error; mod layout; mod prelude; @@ -12,6 +11,7 @@ use crate::prelude::*; #[tokio::main] async fn main() { + color_eyre::install().unwrap(); if let Err(e) = setup_logging() { eprintln!("{e}"); std::process::exit(1); diff --git a/daemon/src/prelude.rs b/daemon/src/prelude.rs index 65bad7d..4e38f64 100644 --- a/daemon/src/prelude.rs +++ b/daemon/src/prelude.rs @@ -2,5 +2,6 @@ use tokio::task::JoinHandle; pub use tracing::{debug, error, info, instrument, trace, warn}; -pub use crate::error::{Error, Result}; -pub type DaemonTask = JoinHandle>; +pub type DaemonTask = JoinHandle>; + +pub use color_eyre::eyre::{Error, Result}; From 7bc9255d0d797402861d15c2bec44e8a110c2184 Mon Sep 17 00:00:00 2001 From: Prometheus1400 Date: Sun, 7 Dec 2025 13:22:00 -0800 Subject: [PATCH 2/2] fix error --- cli/src/app.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cli/src/app.rs b/cli/src/app.rs index 5e8a5ef..fade55a 100644 --- a/cli/src/app.rs +++ b/cli/src/app.rs @@ -1,6 +1,8 @@ use std::{fmt::Debug, io::Stdout, time::Duration}; use bytes::Bytes; +use clap::FromArgMatches; +use color_eyre::eyre; use derivative::Derivative; use ratatui::{Terminal, prelude::CrosstermBackend, restore, widgets::ListState}; use remux_core::{ @@ -130,7 +132,7 @@ impl App { let (input_tx, mut input_rx) = mpsc::channel::(100); let (lua_tx, mut lua_rx) = broadcast::channel(100); self.bg_tasks.extend(input::start_input_listeners(input_tx)); - self.bg_tasks.push(lua::start_status_line_task(lua_tx)); + self.bg_tasks.push(lua::start_status_line_task(lua_tx)?); let mut ticker = interval(Duration::from_millis(50)); debug!("Enabled raw mode"); // execute!(stdout(), EnterAlternateScreen)?; @@ -153,7 +155,7 @@ impl App { match input { Stdin(bytes) => { trace!("stdin({bytes:?}"); - self.dispatch_stdin(bytes).await; + self.dispatch_stdin(bytes).await.unwrap(); } Resize => { debug!("resize"); @@ -292,11 +294,12 @@ impl App { } #[instrument(skip(self, term))] - async fn handle_resize(&mut self, term: &mut Terminal>) { + async fn handle_resize(&mut self, term: &mut Terminal>) -> Result<()> { self.state.terminal.needs_resize = true; term.draw(|f| { ui::draw(f, &mut self.state); - }) - .unwrap(); + })?; + + eyre::Ok(()) } }