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..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,14 +132,14 @@ 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)?;
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 +147,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() => {
@@ -155,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");
@@ -203,7 +203,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 +218,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 +239,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 +250,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 +261,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) {
@@ -290,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(())
}
}
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};