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}