diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-11 09:19:37 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-02-11 09:19:37 +0400 |
| commit | 0931447ec178ed503ff0a085896ec6908cf1292e (patch) | |
| tree | ee808edb795d5bd3fae621add8946a2e4786213d /src | |
| parent | a388c257951107c6d45987bb390f312e5398da71 (diff) | |
| download | niri-0931447ec178ed503ff0a085896ec6908cf1292e.tar.gz niri-0931447ec178ed503ff0a085896ec6908cf1292e.tar.bz2 niri-0931447ec178ed503ff0a085896ec6908cf1292e.zip | |
Implement error reporting in IPC
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipc/client.rs | 27 | ||||
| -rw-r--r-- | src/ipc/server.rs | 24 |
2 files changed, 28 insertions, 23 deletions
diff --git a/src/ipc/client.rs b/src/ipc/client.rs index b2004a7b..27e1eaa1 100644 --- a/src/ipc/client.rs +++ b/src/ipc/client.rs @@ -3,8 +3,8 @@ use std::io::{Read, Write}; use std::net::Shutdown; use std::os::unix::net::UnixStream; -use anyhow::{bail, Context}; -use niri_ipc::{Mode, Output, Request, Response}; +use anyhow::{anyhow, bail, Context}; +use niri_ipc::{Mode, Output, Reply, Request, Response}; use crate::cli::Msg; @@ -36,20 +36,15 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> { .read_to_end(&mut buf) .context("error reading IPC response")?; - if matches!(msg, Msg::Action { .. }) { - if buf.is_empty() { - return Ok(()); - } else { - bail!("unexpected response: expected no response, got {buf:?}"); - } - } + let reply: Reply = serde_json::from_slice(&buf).context("error parsing IPC reply")?; + + let response = reply + .map_err(|msg| anyhow!(msg)) + .context("niri could not handle the request")?; - let response = serde_json::from_slice(&buf).context("error parsing IPC response")?; match msg { Msg::Outputs => { - #[allow(irrefutable_let_patterns)] - let Response::Outputs(outputs) = response - else { + let Response::Outputs(outputs) = response else { bail!("unexpected response: expected Outputs, got {response:?}"); }; @@ -109,7 +104,11 @@ pub fn handle_msg(msg: Msg, json: bool) -> anyhow::Result<()> { println!(); } } - Msg::Action { .. } => unreachable!(), + Msg::Action { .. } => { + let Response::Handled = response else { + bail!("unexpected response: expected Handled, got {response:?}"); + }; + } } Ok(()) diff --git a/src/ipc/server.rs b/src/ipc/server.rs index bedfe48f..a1f3905b 100644 --- a/src/ipc/server.rs +++ b/src/ipc/server.rs @@ -110,7 +110,19 @@ async fn handle_client(ctx: ClientCtx, stream: Async<'_, UnixStream>) -> anyhow: .await .context("error reading request")?; - let request: Request = serde_json::from_str(&buf).context("error parsing request")?; + let reply = process(&ctx, &buf).map_err(|err| { + warn!("error processing IPC request: {err:?}"); + err.to_string() + }); + + let buf = serde_json::to_vec(&reply).context("error formatting reply")?; + write.write_all(&buf).await.context("error writing reply")?; + + Ok(()) +} + +fn process(ctx: &ClientCtx, buf: &str) -> anyhow::Result<Response> { + let request: Request = serde_json::from_str(buf).context("error parsing request")?; let response = match request { Request::Outputs => { @@ -122,15 +134,9 @@ async fn handle_client(ctx: ClientCtx, stream: Async<'_, UnixStream>) -> anyhow: ctx.event_loop.insert_idle(move |state| { state.do_action(action); }); - return Ok(()); + Response::Handled } }; - let buf = serde_json::to_vec(&response).context("error formatting response")?; - write - .write_all(&buf) - .await - .context("error writing response")?; - - Ok(()) + Ok(response) } |
