embedded_bacnet/common/
io.rs

1use super::error::Error;
2
3pub struct Writer<'a> {
4    pub buf: &'a mut [u8],
5    pub index: usize,
6}
7
8impl<'a> Writer<'a> {
9    pub fn new(buf: &'a mut [u8]) -> Self {
10        Self { buf, index: 0 }
11    }
12
13    pub fn push(&mut self, item: u8) {
14        self.buf[self.index] = item;
15        self.index += 1;
16    }
17
18    pub fn extend_from_slice(&mut self, src: &[u8]) {
19        assert!(src.len() <= self.buf.len() - self.index);
20        self.buf[self.index..self.index + src.len()].copy_from_slice(src);
21        self.index += src.len();
22    }
23
24    pub fn to_bytes(&self) -> &[u8] {
25        &self.buf[..self.index]
26    }
27}
28
29#[derive(Debug, Clone)]
30#[cfg_attr(feature = "defmt", derive(defmt::Format))]
31pub struct Reader {
32    pub index: usize,
33    pub end: usize,
34}
35
36impl Reader {
37    pub fn eof(&self) -> bool {
38        self.index >= self.end
39    }
40
41    pub fn new_with_len(len: usize) -> Self {
42        Self { index: 0, end: len }
43    }
44
45    pub fn set_len(&mut self, len: usize) {
46        self.end = len;
47    }
48
49    pub fn read_byte(&mut self, buf: &[u8]) -> Result<u8, Error> {
50        if self.eof() {
51            Err(Error::ReaderEof(self.end))
52        } else {
53            let byte = buf[self.index];
54            self.index += 1;
55            Ok(byte)
56        }
57    }
58
59    pub fn read_bytes<const COUNT: usize>(&mut self, buf: &[u8]) -> Result<[u8; COUNT], Error> {
60        if self.index + COUNT > self.end {
61            Err(Error::ReaderEof(self.index + COUNT))
62        } else {
63            let mut tmp: [u8; COUNT] = [0; COUNT];
64            tmp.copy_from_slice(&buf[self.index..self.index + COUNT]);
65            self.index += COUNT;
66            Ok(tmp)
67        }
68    }
69
70    pub fn read_slice<'a>(&mut self, len: usize, buf: &'a [u8]) -> Result<&'a [u8], Error> {
71        if self.index + len > self.end {
72            Err(Error::ReaderEof(self.index + len))
73        } else {
74            let slice = &buf[self.index..self.index + len];
75            self.index += len;
76            Ok(slice)
77        }
78    }
79}
80
81impl Default for Reader {
82    fn default() -> Self {
83        Self {
84            index: 0,
85            end: usize::MAX - 1000,
86        }
87    }
88}