use super::FixedCodec;
pub trait RangeSource<C: FixedCodec> {
type Error: core::fmt::Debug;
fn to_bytes(value: C::Value<'_>) -> Result<usize, Self::Error>;
fn from_bytes(bytes: usize) -> Result<C::Value<'static>, Self::Error>;
}
#[cfg(test)]
mod tests {
use super::RangeSource;
use crate::{BeU16, FixedCodec, U8};
struct U8Length;
impl RangeSource<U8> for U8Length {
type Error = ();
fn to_bytes(value: <U8 as FixedCodec>::Value<'_>) -> Result<usize, Self::Error> {
Ok(usize::from(value))
}
fn from_bytes(bytes: usize) -> Result<<U8 as FixedCodec>::Value<'static>, Self::Error> {
u8::try_from(bytes).map_err(|_| ())
}
}
struct BeU16Length;
impl RangeSource<BeU16> for BeU16Length {
type Error = ();
fn to_bytes(value: <BeU16 as FixedCodec>::Value<'_>) -> Result<usize, Self::Error> {
Ok(usize::from(value))
}
fn from_bytes(bytes: usize) -> Result<<BeU16 as FixedCodec>::Value<'static>, Self::Error> {
u16::try_from(bytes).map_err(|_| ())
}
}
#[test]
fn local_integer_adapters_need_no_allocation() {
assert_eq!(U8Length::to_bytes(7), Ok(7));
assert_eq!(U8Length::from_bytes(255), Ok(255));
assert_eq!(BeU16Length::to_bytes(0x1234), Ok(0x1234));
assert_eq!(BeU16Length::from_bytes(0xffff), Ok(0xffff));
}
}