pub mod header {
pub trait Min {
fn min() -> usize;
}
pub trait Max {
fn max() -> usize;
}
pub trait Size {
fn size(&self) -> usize;
}
}
pub mod payload {
pub trait Min {
fn min() -> usize;
}
pub trait Max {
fn max() -> usize;
}
pub trait Size {
fn size(&self) -> usize;
}
}
pub trait Min {
fn min() -> usize;
}
pub trait Max {
fn max() -> usize;
}
pub trait Size {
fn size(&self) -> usize;
}
impl<T: header::Min + payload::Min> Min for T {
fn min() -> usize {
<Self as header::Min>::min() + <Self as payload::Min>::min()
}
}
impl<T: header::Max + payload::Max> Max for T {
fn max() -> usize {
<Self as header::Max>::max() + <Self as payload::Max>::max()
}
}
impl<T: header::Size + payload::Size> Size for T {
fn size(&self) -> usize {
<Self as header::Size>::size(self) + <Self as payload::Size>::size(self)
}
}
macro_rules! sized {
() => ();
($name:ident, ) => ();
($name:ident => $part:ident; ) => ();
($name:ident, $part:ident { $($defs:tt)* } $($rest:tt)*) => (
sized!($name => $part; $($defs)*);
sized!($name, $($rest)*);
);
($name:ident => $part:ident; min: $value:expr, $($rest:tt)*) => (
impl<B> crate::size::$part::Min for $name<B> {
fn min() -> usize {
$value
}
}
sized!($name => $part; $($rest)*);
);
($name:ident => $part:ident; max: $value:expr, $($rest:tt)*) => (
impl<B> crate::size::$part::Max for $name<B> {
fn max() -> usize {
$value
}
}
sized!($name => $part; $($rest)*);
);
($name:ident => $part:ident; size: $value:expr, $($rest:tt)*) => (
impl<B: AsRef<[u8]>> crate::size::$part::Size for $name<B> {
fn size(&self) -> usize {
$value
}
}
sized!($name => $part; $($rest)*);
);
($name:ident => $part:ident; size: $packet:ident => $value:expr, $($rest:tt)*) => (
impl<B: AsRef<[u8]>> crate::size::$part::Size for $name<B> {
fn size(&self) -> usize {
let $packet = self;
$value
}
}
sized!($name => $part; $($rest)*);
);
}