binary_cookies/sync/
meta.rs

1use std::io::Read;
2
3use crate::{
4    cookie::{Checksum, Metadata},
5    decode::{meta::MetaFsm, DecodeResult},
6    error::Result,
7};
8
9#[derive(Clone, Copy)]
10#[derive(Debug)]
11#[derive(Default)]
12#[derive(PartialEq, Eq, PartialOrd, Ord)]
13pub struct MetaDecoder<R: Read> {
14    pub(crate) rd: R,
15}
16
17impl<R: Read> MetaDecoder<R> {
18    pub fn decode(&mut self) -> Result<(Checksum, Option<Metadata>)> {
19        let mut fsm = MetaFsm::new();
20        loop {
21            self.rd
22                .read_exact(fsm.buffer.space())?;
23            let count = fsm.buffer.available_space();
24            fsm.buffer.fill(count);
25            match fsm.process()? {
26                DecodeResult::Continue(fsm_) => {
27                    fsm = fsm_;
28                    continue;
29                },
30                DecodeResult::Done(done) => return Ok(done),
31            }
32        }
33    }
34}