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