binary_cookies/sync/
bc.rs

1//! binarycookies mod
2
3use std::io::Read;
4
5use super::{cursor::CookieCursor, meta::MetaDecoder};
6use crate::{
7    decode::{binary_cookies::BinaryCookieFsm, meta::MetaOffset, pages::PagesOffset, DecodeResult},
8    error::Result,
9    sync::page::PagesHandle,
10};
11
12pub trait DecodeBinaryCookie {
13    type File: CookieCursor;
14
15    fn decode(&self) -> Result<BinaryCookiesHandle<'_, Self::File>>;
16}
17
18impl<F> DecodeBinaryCookie for F
19where
20    F: CookieCursor,
21{
22    type File = F;
23
24    fn decode(&self) -> Result<BinaryCookiesHandle<'_, F>> {
25        let mut fsm = BinaryCookieFsm::new();
26        let mut rd = self.cursor_at(0);
27        loop {
28            rd.read_exact(fsm.buffer.space())?;
29            let count = fsm.buffer.available_space();
30            fsm.buffer.fill(count);
31            match fsm.process()? {
32                DecodeResult::Continue(fsm_) => {
33                    fsm = fsm_;
34                    continue;
35                },
36                DecodeResult::Done((meta_offset, pages_offset, _)) => {
37                    return Ok(BinaryCookiesHandle {
38                        file: self,
39                        meta_offset,
40                        pages_offset,
41                    })
42                },
43            }
44        }
45    }
46}
47
48#[derive(Clone)]
49#[derive(Debug)]
50pub struct BinaryCookiesHandle<'a, F: CookieCursor> {
51    pub(crate) file: &'a F,
52    pub(crate) meta_offset: MetaOffset,
53    pub(crate) pages_offset: PagesOffset,
54}
55
56impl<'a, F: CookieCursor> BinaryCookiesHandle<'a, F> {
57    pub fn into_handles(
58        self,
59    ) -> (
60        PagesHandle<'a, F>,
61        MetaDecoder<<F as CookieCursor>::Cursor<'a>>,
62    ) {
63        let pages_handle = PagesHandle {
64            file: self.file,
65            offset: self.pages_offset,
66        };
67        let meta_handle = MetaDecoder {
68            rd: self
69                .file
70                .cursor_at(self.meta_offset),
71        };
72        (pages_handle, meta_handle)
73    }
74}