binary_cookies/decode/
cookies.rs

1use std::ops::Deref;
2
3use oval::Buffer;
4use winnow::{
5    stream::{Offset, Stream},
6    Parser,
7};
8
9use super::{DecodeResult, OffsetSize};
10use crate::{cookie::Cookie, decode::StreamIn, error::Result};
11
12#[derive(Clone)]
13#[derive(Debug)]
14#[derive(Default)]
15#[derive(PartialEq, Eq, PartialOrd, Ord)]
16pub struct CookiesOffsetInPage(pub(crate) Vec<u32>);
17
18impl Deref for CookiesOffsetInPage {
19    type Target = [u32];
20
21    fn deref(&self) -> &Self::Target {
22        &self.0
23    }
24}
25
26#[derive(Clone)]
27#[derive(Debug)]
28#[derive(PartialEq, Eq, PartialOrd, Ord)]
29pub struct CookiesOffset {
30    pub(crate) offset_sizes: Vec<OffsetSize>,
31}
32
33impl CookiesOffset {
34    // NOTE: The offset_sizes order is reverse
35    pub(crate) fn new(page_offset: u64, page_size: u32, cookies_offset: &[u32]) -> Self {
36        let mut prev_cookie_end = page_size;
37
38        let offset_sizes: Vec<OffsetSize> = cookies_offset
39            .iter()
40            .rev()
41            .map(|&offset_in_page| {
42                let res = OffsetSize {
43                    offset: offset_in_page as u64 + page_offset,
44                    size: prev_cookie_end - offset_in_page,
45                };
46                prev_cookie_end = offset_in_page;
47                res
48            })
49            .collect();
50
51        Self { offset_sizes }
52    }
53}
54
55#[derive(Clone)]
56#[derive(Debug)]
57pub struct CookieFsm {
58    pub(crate) buffer: Buffer,
59}
60
61impl Default for CookieFsm {
62    fn default() -> Self {
63        Self::new()
64    }
65}
66
67impl CookieFsm {
68    /// Just cookie size
69    const BUF_SIZE: usize = 4;
70
71    pub fn new() -> Self {
72        let buffer = Buffer::with_capacity(Self::BUF_SIZE);
73        Self { buffer }
74    }
75
76    pub fn with_capacity(size: usize) -> Self {
77        let buffer = Buffer::with_capacity(size);
78        Self { buffer }
79    }
80
81    pub fn process(mut self) -> Result<DecodeResult<Self, (Cookie, Buffer)>> {
82        let mut input: StreamIn = StreamIn::new(self.buffer.data());
83        let start = input.checkpoint();
84
85        let e = match Cookie::decode.parse_next(&mut input) {
86            Ok(o) => {
87                let consumed = input.offset_from(&start);
88                self.buffer.consume(consumed);
89                return Ok(DecodeResult::Done((o, self.buffer)));
90            },
91            Err(e) => e,
92        };
93
94        mode_err! {self, e, self.buffer}
95    }
96}