binary_cookies/decode/
mod.rs

1macro_rules! mode_err {
2    ($self:ident, $e:ident, $buffer:expr) => {
3        use winnow::error::ErrMode;
4        use winnow::error::Needed;
5        use $crate::error::ParseError;
6        use $crate::decode::DecodeResult;
7
8        match $e {
9            ErrMode::Backtrack(e) | ErrMode::Cut(e) => Err(ParseError::WinnowCtx(e)),
10            ErrMode::Incomplete(Needed::Unknown) => {
11                // The branch is unreachable?
12                let new_cap = $buffer.capacity() * 2;
13                $buffer.grow(new_cap);
14                Ok(DecodeResult::Continue($self))
15            },
16            ErrMode::Incomplete(Needed::Size(size)) => {
17                let need_size = size.get();
18                $buffer
19                    .grow($buffer.available_data() + need_size);
20                if $buffer.available_space() < need_size {
21                    $buffer.shift();
22                }
23                Ok(DecodeResult::Continue($self))
24            },
25        }
26    };
27}
28
29pub mod binary_cookies;
30pub mod cookies;
31pub mod meta;
32pub mod pages;
33#[cfg(any(feature = "sync", feature = "tokio"))]
34pub mod stream;
35
36use chrono::{offset::LocalResult, DateTime, TimeZone as _, Utc};
37use winnow::Partial;
38
39pub(crate) type StreamIn<'i> = Partial<&'i [u8]>;
40
41#[derive(Clone, Copy)]
42#[derive(Debug)]
43#[derive(PartialEq, Eq, PartialOrd, Ord)]
44pub enum DecodeResult<C, R> {
45    Continue(C),
46    Done(R),
47}
48
49/// A item offset in binarycookies and it's size.
50#[derive(Clone, Copy)]
51#[derive(Debug)]
52#[derive(Default)]
53#[derive(PartialEq, Eq, PartialOrd, Ord)]
54pub struct OffsetSize {
55    /// The item relative binarycookies start offset.
56    pub(crate) offset: u64,
57    /// The item size.
58    pub(crate) size: u32,
59}
60
61pub(crate) trait F64ToSafariTime {
62    fn to_utc(&self) -> Option<DateTime<Utc>>;
63}
64impl F64ToSafariTime for f64 {
65    #[expect(clippy::cast_sign_loss, reason = "Don't worry")]
66    fn to_utc(&self) -> Option<DateTime<Utc>> {
67        let seconds = self.trunc() as i64 + 978_307_200;
68        let nanos = ((self.fract()) * 1_000_000_000_f64) as u32;
69
70        match Utc.timestamp_opt(seconds, nanos) {
71            LocalResult::Single(time) => Some(time),
72            LocalResult::Ambiguous(..) | LocalResult::None => None,
73        }
74    }
75}