use super::*;
pub trait DecodeFrame<S>: Sized
where
S: winnow::stream::Stream,
{
fn decode_frame(input: &mut S) -> crate::Result<Self>;
}
impl<S, T> DecodeFrame<S> for T
where
S: winnow::stream::Stream,
T: SeekSentinel<S> + DecodeValue<S>,
{
fn decode_frame(input: &mut S) -> crate::Result<Self> {
let mut sought = T::seek_sentinel.parse_next(input)?;
let checkpoint = input.checkpoint();
Self::decode_value(&mut sought).map_err(|e| {
e.add_context(
input,
&checkpoint,
winnow::error::StrContext::Label("Unable to parse data embedded in packet"),
)
})
}
}
pub trait DrainFrames<S>: Sized
where
S: winnow::stream::Stream,
{
fn drain_frames(input: &mut S) -> crate::Result<Vec<Self>>;
}
impl<S, T> DrainFrames<S> for T
where
T: DecodeFrame<S>,
S: winnow::stream::Stream,
{
fn drain_frames(input: &mut S) -> crate::Result<Vec<Self>> {
winnow::combinator::repeat(0.., Self::decode_frame).parse_next(input)
}
}