use crate::{Decode, Error, RangeCfg, Read};
use bytes::Buf;
use core::ops::RangeBounds;
pub trait ReadExt: Read<Cfg = ()> {
fn read(buf: &mut impl Buf) -> Result<Self, Error> {
Self::read_cfg(buf, &())
}
}
impl<T: Read<Cfg = ()>> ReadExt for T {}
pub trait IsUnit: Default {}
impl IsUnit for () {}
impl<T: IsUnit, const N: usize> IsUnit for [T; N] where [T; N]: Default {}
macro_rules! impl_is_unit_for_tuple {
( $($T:ident),+ ) => {
impl<$($T),+> IsUnit for ( $($T),+ ) where $($T: IsUnit),+ {}
}
}
impl_is_unit_for_tuple!(A, B);
impl_is_unit_for_tuple!(A, B, C);
impl_is_unit_for_tuple!(A, B, C, D);
impl_is_unit_for_tuple!(A, B, C, D, E);
impl_is_unit_for_tuple!(A, B, C, D, E, F);
impl_is_unit_for_tuple!(A, B, C, D, E, F, G);
impl_is_unit_for_tuple!(A, B, C, D, E, F, G, H);
impl_is_unit_for_tuple!(A, B, C, D, E, F, G, H, I);
impl_is_unit_for_tuple!(A, B, C, D, E, F, G, H, I, J);
impl_is_unit_for_tuple!(A, B, C, D, E, F, G, H, I, J, K);
impl_is_unit_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);
pub trait DecodeExt<X: IsUnit>: Decode<Cfg = X> {
fn decode(buf: impl Buf) -> Result<Self, Error> {
Self::decode_cfg(buf, &X::default())
}
}
impl<X: IsUnit, T: Decode<Cfg = X>> DecodeExt<X> for T {}
pub trait ReadRangeExt<X: IsUnit>: Read<Cfg = (RangeCfg<usize>, X)> {
fn read_range(buf: &mut impl Buf, range: impl RangeBounds<usize>) -> Result<Self, Error> {
Self::read_cfg(buf, &(RangeCfg::new(range), X::default()))
}
}
impl<X: IsUnit, U: Read<Cfg = (RangeCfg<usize>, X)>> ReadRangeExt<X> for U {}
pub trait DecodeRangeExt<X: IsUnit>: Decode<Cfg = (RangeCfg<usize>, X)> {
fn decode_range(buf: impl Buf, range: impl RangeBounds<usize>) -> Result<Self, Error> {
Self::decode_cfg(buf, &(RangeCfg::new(range), X::default()))
}
}
impl<X: IsUnit, U: Decode<Cfg = (RangeCfg<usize>, X)>> DecodeRangeExt<X> for U {}