binary_cookies/decode/
binary_cookies.rs1use oval::Buffer;
2use winnow::{
3    stream::{Offset, Stream},
4    Parser,
5};
6
7use super::{meta::MetaOffset, pages::PagesOffset, DecodeResult};
8use crate::{cookie::BinaryCookies, decode::StreamIn, error::Result};
9
10#[derive(Clone)]
11#[derive(Debug)]
12#[derive(PartialEq)]
13pub struct BinaryCookieFsm {
14    pub(crate) buffer: Buffer,
15}
16
17impl Default for BinaryCookieFsm {
18    fn default() -> Self {
19        Self::new()
20    }
21}
22
23#[derive(Clone)]
25#[derive(Debug)]
26#[derive(Default)]
27#[derive(PartialEq, Eq, PartialOrd, Ord)]
28pub struct Offsets {
29    pub(crate) page_sizes: Vec<u32>, pub(crate) tail_offset: u64,
31}
32
33impl BinaryCookieFsm {
34    const BUF_SIZE: usize = 4 + 4 + 4 * 2;
37
38    pub fn new() -> Self {
39        Self {
40            buffer: Buffer::with_capacity(Self::BUF_SIZE),
41        }
42    }
43
44    pub fn process(mut self) -> Result<DecodeResult<Self, (MetaOffset, PagesOffset, Buffer)>> {
45        let mut input: StreamIn = StreamIn::new(self.buffer.data());
46        let start = input.checkpoint();
47
48        let e = match BinaryCookies::decode_head.parse_next(&mut input) {
49            Ok(offsets) => {
50                let consumed = input.offset_from(&start);
51                self.buffer.consume(consumed);
52                return Ok(DecodeResult::Done((
53                    offsets.tail_offset,
54                    PagesOffset::new(offsets.page_sizes),
55                    self.buffer,
56                )));
57            },
58            Err(e) => e,
59        };
60        mode_err! {self, e, self.buffer}
61    }
62}