1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
use std::io::{self, BufRead, BufReader, Stdin, Stdout, Write}; use std::process::{Child, ChildStdin, ChildStdout}; pub struct Connection<Source: BufRead, Sink: Write> { source: Source, sink: Sink, } impl<Source: BufRead, Sink: Write> Connection<Source, Sink> { pub fn new(source: Source, sink: Sink) -> Self { Self { source, sink } } } impl Connection<BufReader<ChildStdout>, ChildStdin> { pub fn new_from_child(child: Child) -> Option<Self> { let stdin = child.stdin?; let stdout = child.stdout?; Some(Self { source: BufReader::new(stdout), sink: stdin, }) } } impl Connection<BufReader<Stdin>, Stdout> { pub fn new_from_current_process() -> Self { Self { source: BufReader::new(io::stdin()), sink: io::stdout(), } } } impl<Source: BufRead, Sink: Write> Connection<Source, Sink> { pub fn recv_message<T: serde::de::DeserializeOwned>(&mut self) -> Result<T, MessageIoError> { let mut buf = String::new(); self.source .read_line(&mut buf) .map_err(MessageIoError::Recv)?; Ok(serde_json::from_str(&buf)?) } pub fn send_message<T: serde::Serialize>(&mut self, t: &T) -> Result<(), MessageIoError> { let json = serde_json::to_vec(t)?; self.sink.write_all(&json).map_err(MessageIoError::Send)?; self.sink.write_all(b"\n").map_err(MessageIoError::Send)?; Ok(()) } } #[derive(Debug, thiserror::Error)] pub enum MessageIoError { #[error("failed receiving message from source")] Recv(io::Error), #[error("failed sending message to sink")] Send(io::Error), #[error("failed deserializing JSON")] Json(#[from] serde_json::Error), }