aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/rbw-agent/sock.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-04-12 00:08:03 -0400
committerJesse Luehrs <doy@tozt.net>2020-04-12 00:08:03 -0400
commit236f06736e45c2a70f43589c9d447a0a3ef240b5 (patch)
treec390d4cbfec5223ac1aefe3947f8e1bb885757d2 /src/bin/rbw-agent/sock.rs
parent91d1d1890bdc3ee75b69e00d5368c5b29a4f461c (diff)
downloadrbw-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.rs36
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)
}