From 58383646f8245f62f5184b7e13a29d2b48c7f927 Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Sat, 15 Mar 2025 14:09:51 +0100 Subject: [PATCH] better error handling --- Cargo.lock | 1 + lan-mouse-cli/Cargo.toml | 1 + lan-mouse-cli/src/lib.rs | 22 ++++++++++++++-------- lan-mouse-ipc/src/connect_async.rs | 3 +-- src/main.rs | 3 +++ 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c51269b..c453d28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2008,6 +2008,7 @@ dependencies = [ "clap", "futures", "lan-mouse-ipc", + "thiserror 2.0.0", "tokio", ] diff --git a/lan-mouse-cli/Cargo.toml b/lan-mouse-cli/Cargo.toml index 743c00b..238bffc 100644 --- a/lan-mouse-cli/Cargo.toml +++ b/lan-mouse-cli/Cargo.toml @@ -10,6 +10,7 @@ repository = "https://github.com/feschber/lan-mouse" futures = "0.3.30" lan-mouse-ipc = { path = "../lan-mouse-ipc", version = "0.2.0" } clap = { version = "4.4.11", features = ["derive"] } +thiserror = "2.0.0" tokio = { version = "1.32.0", features = [ "io-util", "io-std", diff --git a/lan-mouse-cli/src/lib.rs b/lan-mouse-cli/src/lib.rs index 211f91f..3e3533e 100644 --- a/lan-mouse-cli/src/lib.rs +++ b/lan-mouse-cli/src/lib.rs @@ -2,17 +2,23 @@ use clap::{Args, Parser, Subcommand}; use futures::StreamExt; use std::{net::IpAddr, time::Duration}; +use thiserror::Error; use lan_mouse_ipc::{ - connect_async, ClientHandle, FrontendEvent, FrontendRequest, IpcError, Position, + connect_async, ClientHandle, FrontendEvent, FrontendRequest, ConnectionError, IpcError, Position, }; +#[derive(Debug, Error)] +pub enum CliError { + /// is the service running? + #[error("could not connect: `{0}` - is the service running?")] + ServiceNotRunning(#[from] ConnectionError), + #[error("error communicating with service: {0}")] + Ipc(#[from] IpcError), +} + #[derive(Parser, Debug, PartialEq, Eq)] -#[command( - name = "lan-mouse-cli", - about = "LanMouse CLI interface", - flatten_help = true -)] +#[command(name = "lan-mouse-cli", about = "LanMouse CLI interface")] pub struct CliArgs { #[command(subcommand)] command: CliSubcommand, @@ -66,12 +72,12 @@ enum CliSubcommand { RemoveAuthorizedKey { sha256_fingerprint: String }, } -pub async fn run(args: CliArgs) -> Result<(), IpcError> { +pub async fn run(args: CliArgs) -> Result<(), CliError> { execute(args.command).await?; Ok(()) } -async fn execute(cmd: CliSubcommand) -> Result<(), IpcError> { +async fn execute(cmd: CliSubcommand) -> Result<(), CliError> { let (mut rx, mut tx) = connect_async(Some(Duration::from_millis(500))).await?; match cmd { CliSubcommand::AddClient(Client { diff --git a/lan-mouse-ipc/src/connect_async.rs b/lan-mouse-ipc/src/connect_async.rs index 6d63fc7..ea4fa9e 100644 --- a/lan-mouse-ipc/src/connect_async.rs +++ b/lan-mouse-ipc/src/connect_async.rs @@ -1,7 +1,6 @@ use crate::{ConnectionError, FrontendEvent, FrontendRequest, IpcError}; use std::{ cmp::min, - io, task::{ready, Poll}, time::Duration, }; @@ -47,7 +46,7 @@ impl Stream for AsyncFrontendEventReader { } impl AsyncFrontendRequestWriter { - pub async fn request(&mut self, request: FrontendRequest) -> Result<(), io::Error> { + pub async fn request(&mut self, request: FrontendRequest) -> Result<(), IpcError> { let mut json = serde_json::to_string(&request).unwrap(); log::debug!("requesting: {json}"); json.push('\n'); diff --git a/src/main.rs b/src/main.rs index 45ddfdc..2cee5b8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ use lan_mouse::{ service::{Service, ServiceError}, }; use lan_mouse_ipc::{IpcError, IpcListenerCreationError}; +use lan_mouse_cli::CliError; use std::{ future::Future, io, @@ -31,6 +32,8 @@ enum LanMouseError { Capture(#[from] InputCaptureError), #[error(transparent)] Emulation(#[from] InputEmulationError), + #[error(transparent)] + Cli(#[from] CliError), } fn main() {