Skip to main content

sark_json/
body.rs

1use crate::Result;
2use crate::error::Fail;
3
4#[derive(Clone, Copy)]
5pub struct InlineToken<const N: usize> {
6    len: u8,
7    bytes: [u8; N],
8}
9
10impl<const N: usize> InlineToken<N> {
11    pub const fn new() -> Self {
12        Self {
13            len: 0,
14            bytes: [0; N],
15        }
16    }
17
18    pub(crate) fn from_slice(bytes: &[u8]) -> Result<Self> {
19        let len = u8::try_from(bytes.len()).map_err(|_| Fail::bad())?;
20        if bytes.len() > N {
21            return Err(Fail::bad());
22        }
23        let mut out = Self::new();
24        out.bytes[..bytes.len()].copy_from_slice(bytes);
25        out.len = len;
26        Ok(out)
27    }
28
29    pub fn push(&mut self, b: u8) -> Result<()> {
30        let idx = self.len as usize;
31        if idx >= N {
32            return Err(Fail::bad());
33        }
34        self.bytes[idx] = b;
35        self.len += 1;
36        Ok(())
37    }
38
39    pub fn as_bytes(&self) -> &[u8] {
40        &self.bytes[..self.len as usize]
41    }
42
43    pub fn len(&self) -> usize {
44        self.len as usize
45    }
46
47    pub fn is_empty(&self) -> bool {
48        self.len == 0
49    }
50}
51
52impl<const N: usize> Default for InlineToken<N> {
53    fn default() -> Self {
54        Self::new()
55    }
56}