embedded_bacnet/common/
io.rs1use 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}