Macro tarrasque::extract
[−]
[src]
macro_rules! extract { ( $(#[$attribute:meta])* pub $name:ident$([$length:expr])*$(($($pname:ident: $pty:ty),*))* { $($(#[$fattribute:meta])* $fname:ident: $ftype:ty = ($($fextract:tt)*),)* } ) => { ... }; ( $(#[$attribute:meta])* pub $name:ident<$lt:tt>$([$length:expr])*$(($($pname:ident: $pty:ty),*))* { $($(#[$fattribute:meta])* $fname:ident: $ftype:ty = ($($fextract:tt)*),)* } ) => { ... }; ( @IMPL: $name:ident$(<$lt:tt>)*: : $($fname:ident: $ftype:ty = ($($fextract:tt)*),)* ) => { ... }; ( @IMPL: $name:ident$(<$lt:tt>)*: ($pname:ident: $pty:ty): $($fname:ident: $ftype:ty = ($($fextract:tt)*),)* ) => { ... }; ( @IMPL: $name:ident$(<$lt:tt>)*: ($($pname:ident: $pty:ty),*): $($fname:ident: $ftype:ty = ($($fextract:tt)*),)* ) => { ... }; (@EXTRACT: $stream:expr, $s:ident => $f:expr) => { ... }; (@EXTRACT: $stream:expr, [extract]) => { ... }; (@EXTRACT: $stream:expr, [extract($param:expr)]) => { ... }; (@EXTRACT: $stream:expr, [extract($($param:expr),*)]) => { ... }; (@EXTRACT: $stream:expr, $expr:expr) => { ... }; }
Defines a struct with a corresponding [Extract
] implementation.
Examples
Zero parameters and no lifetime:
extract! { /// An example struct. #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub Struct { a: u16 = ([extract]), b: u16 = ([extract]), c: u16 = (a + b), d: u16 = ([extract(Endianness::Little)]), e: u16 = (s => s.extract(Endianness::Little).map(|i: u16| i + 1)), } } let bytes = &[1, 2, 3, 4, 5, 6, 7, 8]; let mut stream = Stream(bytes); let value: Struct = stream.extract(()).unwrap(); assert_eq!(value.a, 0x0102); assert_eq!(value.b, 0x0304); assert_eq!(value.c, 0x0406); assert_eq!(value.d, 0x0605); assert_eq!(value.e, 0x0808);
Two parameters and a lifetime:
extract! { /// An example struct. #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub Struct<'a>(left: usize, right: usize) { foo: &'a str = ([extract(left)]), bar: &'a str = ([extract(right)]), } } let mut stream = Stream(&[102, 111, 111, 98, 97, 114]); let value: Struct = stream.extract((3, 3)).unwrap(); assert_eq!(value.foo, "foo"); assert_eq!(value.bar, "bar");