binary_cookies/sync/
bc.rs1use 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}