paper_utils/stream/
mod.rs1pub mod error;
9pub mod reader;
10
11use std::io::{Read, Write};
12
13#[cfg(feature = "tokio")]
14use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
15
16pub type Buffer = Box<[u8]>;
17pub type StackBuffer<const N: usize> = [u8; N];
18
19pub fn read_buf(reader: &mut impl Read, buf_size: usize) -> Result<Buffer, StreamError> {
20 let mut buf = vec![0u8; buf_size].into_boxed_slice();
21
22 match reader.read_exact(&mut buf) {
23 Ok(_) => Ok(buf),
24 Err(_) => Err(StreamError::ClosedStream),
25 }
26}
27
28#[cfg(feature = "tokio")]
29pub async fn read_buf_async<R>(reader: &mut R, buf_size: usize) -> Result<Buffer, StreamError>
30where
31 R: AsyncRead + Unpin,
32{
33 let mut buf = vec![0u8; buf_size].into_boxed_slice();
34
35 match reader.read_exact(&mut buf).await {
36 Ok(_) => Ok(buf),
37 Err(_) => Err(StreamError::ClosedStream),
38 }
39}
40
41pub fn read_stack_buf<const N: usize>(
42 reader: &mut impl Read,
43) -> Result<StackBuffer<N>, StreamError> {
44 let mut buf = [0u8; N];
45
46 match reader.read_exact(&mut buf) {
47 Ok(_) => Ok(buf),
48 Err(_) => Err(StreamError::ClosedStream),
49 }
50}
51
52#[cfg(feature = "tokio")]
53pub async fn read_stack_buf_async<R, const N: usize>(
54 reader: &mut R,
55) -> Result<StackBuffer<N>, StreamError>
56where
57 R: AsyncRead + Unpin,
58{
59 let mut buf = [0u8; N];
60
61 match reader.read_exact(&mut buf).await {
62 Ok(_) => Ok(buf),
63 Err(_) => Err(StreamError::ClosedStream),
64 }
65}
66
67pub fn write_buf(writer: &mut impl Write, buf: &[u8]) -> Result<(), StreamError> {
68 match writer.write_all(buf) {
69 Ok(_) => Ok(()),
70 Err(_) => Err(StreamError::InvalidStream),
71 }
72}
73
74#[cfg(feature = "tokio")]
75pub async fn write_buf_async<W>(writer: &mut W, buf: &[u8]) -> Result<(), StreamError>
76where
77 W: AsyncWrite + Unpin,
78{
79 writer
80 .write_all(buf)
81 .await
82 .map_err(|_| StreamError::InvalidStream)?;
83
84 writer
85 .flush()
86 .await
87 .map_err(|_| StreamError::InvalidStream)?;
88
89 Ok(())
90}
91
92pub use crate::stream::{error::*, reader::*};