binary_cookies/tokio/
meta.rs

1use tokio::io::{AsyncRead, AsyncReadExt};
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: AsyncRead> {
14    pub(crate) rd: R,
15}
16
17impl<R: AsyncRead + Unpin + Send> MetaDecoder<R> {
18    pub async 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                .await?;
24            let count = fsm.buffer.available_space();
25            fsm.buffer.fill(count);
26            match fsm.process()? {
27                DecodeResult::Continue(fsm_) => {
28                    fsm = fsm_;
29                    continue;
30                },
31                DecodeResult::Done(done) => return Ok(done),
32            }
33        }
34    }
35}