aboutsummaryrefslogtreecommitdiff
path: root/src/ipc/client.rs
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/client.rs
parenta388c257951107c6d45987bb390f312e5398da71 (diff)
downloadniri-0931447ec178ed503ff0a085896ec6908cf1292e.tar.gz
niri-0931447ec178ed503ff0a085896ec6908cf1292e.tar.bz2
niri-0931447ec178ed503ff0a085896ec6908cf1292e.zip
Implement error reporting in IPC
Diffstat (limited to 'src/ipc/client.rs')
-rw-r--r--src/ipc/client.rs27
1 files changed, 13 insertions, 14 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(())