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