binary_cookies/sync/
meta.rs

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