diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-04-12 00:08:03 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-04-12 00:08:03 -0400 |
commit | 236f06736e45c2a70f43589c9d447a0a3ef240b5 (patch) | |
tree | c390d4cbfec5223ac1aefe3947f8e1bb885757d2 /src/bin/rbw-agent/sock.rs | |
parent | 91d1d1890bdc3ee75b69e00d5368c5b29a4f461c (diff) | |
download | rbw-236f06736e45c2a70f43589c9d447a0a3ef240b5.tar.gz rbw-236f06736e45c2a70f43589c9d447a0a3ef240b5.zip |
improve error handling and reporting
Diffstat (limited to 'src/bin/rbw-agent/sock.rs')
-rw-r--r-- | src/bin/rbw-agent/sock.rs | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/bin/rbw-agent/sock.rs b/src/bin/rbw-agent/sock.rs index 73ad5c2..6931b13 100644 --- a/src/bin/rbw-agent/sock.rs +++ b/src/bin/rbw-agent/sock.rs @@ -1,3 +1,4 @@ +use anyhow::Context as _; use tokio::io::{AsyncBufReadExt as _, AsyncWriteExt as _}; pub struct Sock(tokio::net::UnixStream); @@ -7,30 +8,45 @@ impl Sock { Self(s) } - pub async fn send(&mut self, res: &rbw::agent::Response) { + pub async fn send( + &mut self, + res: &rbw::agent::Response, + ) -> anyhow::Result<()> { let Self(sock) = self; - sock.write_all(serde_json::to_string(res).unwrap().as_bytes()) + sock.write_all( + serde_json::to_string(res) + .context("failed to serialize message")? + .as_bytes(), + ) + .await + .context("failed to write message to socket")?; + sock.write_all(b"\n") .await - .unwrap(); - sock.write_all(b"\n").await.unwrap(); + .context("failed to write message to socket")?; + Ok(()) } - pub async fn recv(&mut self) -> rbw::agent::Request { + pub async fn recv(&mut self) -> anyhow::Result<rbw::agent::Request> { let Self(sock) = self; let mut buf = tokio::io::BufStream::new(sock); let mut line = String::new(); - buf.read_line(&mut line).await.unwrap(); - serde_json::from_str(&line).unwrap() + buf.read_line(&mut line) + .await + .context("failed to read message from socket")?; + Ok(serde_json::from_str(&line).context("failed to parse message")?) } } pub fn listen() -> anyhow::Result<tokio::net::UnixListener> { let runtime_dir = rbw::dirs::runtime_dir(); - std::fs::create_dir_all(&runtime_dir)?; + std::fs::create_dir_all(&runtime_dir) + .context("failed to create runtime dir")?; let path = runtime_dir.join("socket"); - std::fs::remove_file(&path)?; - let sock = tokio::net::UnixListener::bind(&path)?; + // if the socket already doesn't exist, that's fine + let _ = std::fs::remove_file(&path); + let sock = tokio::net::UnixListener::bind(&path) + .context("failed to listen on socket")?; log::debug!("listening on socket {}", path.to_string_lossy()); Ok(sock) } |