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