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");