io_stream/runtimes/
std.rs

1//! Module dedicated to the standard, blocking runtime.
2
3use std::io::{self, Read, Write};
4
5use log::trace;
6
7use crate::{Io, Output};
8
9/// The main runtime I/O handler.
10///
11/// This handler makes use of standard modules [`std::io`] to process
12/// stream [`Io`].
13pub 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}