aboutsummaryrefslogtreecommitdiff
path: root/src/ipc
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-11 09:19:37 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-11 09:19:37 +0400
commit0931447ec178ed503ff0a085896ec6908cf1292e (patch)
treeee808edb795d5bd3fae621add8946a2e4786213d /src/ipc
parenta388c257951107c6d45987bb390f312e5398da71 (diff)
downloadniri-0931447ec178ed503ff0a085896ec6908cf1292e.tar.gz
niri-0931447ec178ed503ff0a085896ec6908cf1292e.tar.bz2
niri-0931447ec178ed503ff0a085896ec6908cf1292e.zip
Implement error reporting in IPC
Diffstat (limited to 'src/ipc')
-rw-r--r--src/ipc/client.rs27
-rw-r--r--src/ipc/server.rs24
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)
}