Skip to main content

ax_io/utils/
iofn.rs

1use crate::{Read, Result, Write};
2
3/// Reader created by [`read_fn`].
4pub struct ReadFn<R> {
5    r: R,
6}
7
8/// Creates a reader that wraps a function.
9pub fn read_fn<R>(r: R) -> ReadFn<R>
10where
11    R: FnMut(&mut [u8]) -> Result<usize>,
12{
13    ReadFn { r }
14}
15
16impl<R> Read for ReadFn<R>
17where
18    R: FnMut(&mut [u8]) -> Result<usize>,
19{
20    #[inline]
21    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
22        (self.r)(buf)
23    }
24}
25
26/// Writer created by [`write_fn`].
27pub struct WriteFn<W> {
28    w: W,
29}
30
31/// Creates a writer that wraps a function.
32pub fn write_fn<W>(w: W) -> WriteFn<W>
33where
34    W: FnMut(&[u8]) -> Result<usize>,
35{
36    WriteFn { w }
37}
38
39impl<W> Write for WriteFn<W>
40where
41    W: FnMut(&[u8]) -> Result<usize>,
42{
43    #[inline]
44    fn write(&mut self, buf: &[u8]) -> Result<usize> {
45        (self.w)(buf)
46    }
47
48    #[inline]
49    fn flush(&mut self) -> Result<()> {
50        Ok(())
51    }
52}