io_stream/runtimes/
std.rs1use std::io::{self, Read, Write};
4
5use log::trace;
6
7use crate::{Io, Output};
8
9pub fn handle(stream: impl Read + Write, io: Io) -> io::Result<Io> {
14 match io {
15 Io::Error(err) => Err(io::Error::new(io::ErrorKind::Other, err)),
16 Io::Read(io) => read(stream, io),
17 Io::Write(io) => write(stream, io),
18 }
19}
20
21pub fn read(mut stream: impl Read, input: Result<Output, Vec<u8>>) -> io::Result<Io> {
22 let Err(mut buffer) = input else {
23 let kind = io::ErrorKind::InvalidInput;
24 return Err(io::Error::new(kind, "Missing read buffer"));
25 };
26
27 trace!("reading bytes synchronously");
28 let bytes_count = stream.read(&mut buffer)?;
29
30 let output = Output {
31 buffer,
32 bytes_count,
33 };
34
35 Ok(Io::Read(Ok(output)))
36}
37
38pub fn write(mut stream: impl Write, input: Result<Output, Vec<u8>>) -> io::Result<Io> {
39 let Err(buffer) = input else {
40 let kind = io::ErrorKind::InvalidInput;
41 return Err(io::Error::new(kind, "Missing write bytes"));
42 };
43
44 trace!("writing bytes synchronously");
45 let bytes_count = stream.write(&buffer)?;
46
47 let output = Output {
48 buffer,
49 bytes_count,
50 };
51
52 Ok(Io::Write(Ok(output)))
53}