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}