Skip to main content

paper_utils/stream/
mod.rs

1/*
2 * Copyright (c) Kia Shakiba
3 *
4 * This source code is licensed under the GNU AGPLv3 license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8pub 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::*};