use super::ValueDecoder;
use crate::{
Codec,
CodecDecodeError,
CodecValueExt,
codec::assert_unit_bounds,
};
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
pub struct CodecValueDecoder<C> {
codec: C,
}
impl<C> CodecValueDecoder<C>
where
C: Codec,
{
#[must_use]
#[inline]
pub fn new(codec: C) -> Self {
assert_unit_bounds::<C>(&codec);
Self { codec }
}
}
impl<C> ValueDecoder<[C::Unit]> for CodecValueDecoder<C>
where
C: Codec,
{
type Output = C::Value;
type Error = CodecDecodeError<C::DecodeError>;
fn decode(
&mut self,
input: &[C::Unit],
) -> Result<Self::Output, Self::Error> {
let flush_cap = self.codec.max_decode_flush_values();
let (value, _) = if flush_cap == 0 {
self.codec
.decode_exact_value_with_flush(input, &mut [], 0)?
} else {
let mut scratch = Vec::with_capacity(flush_cap);
scratch.resize_with(flush_cap, C::Value::default);
self.codec
.decode_exact_value_with_flush(input, &mut scratch, 0)?
};
Ok(value)
}
}