FPS 0.0.3

Flow processing system (under construction).
#[macro_export]
macro_rules! extract_field {
    ($func_name:ident, $protocol:ident, $length:expr, $name:ident) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let (mut packet, field) = packet.right_packet($length as usize);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $length:expr, $name:ident, $alias1:expr, $alias2:expr) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let (mut packet, field) = packet.right_packet($length as usize);
            packet.context.set_alias($alias1, $alias2);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
}

#[macro_export]
macro_rules! fill_field {
    ($func_name:ident, $protocol:ident, $length:expr, $name:ident) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let (mut packet, field) = packet.left_packet($length as usize);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $length:expr, $name:ident, $alias1:expr, $alias2:expr) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let (mut packet, field) = packet.left_packet($length as usize);
            packet.context.set_alias($alias1, $alias2);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
}

#[macro_export]
macro_rules! extract_field_value {
    ($func_name:ident, $protocol:ident, $name:ident, u8) => {
        #[millefeuille]
        pub fn $func_name (mut packet: Packet) -> Packet {
            let value;
            {
                let field = packet.context.get_field(
                    concat!(stringify!($protocol),"::", stringify!($name)));
                value = field.read_u8(0);
            }
            packet.context.set_u8(
                concat!(stringify!($protocol),"::", stringify!($name),"_u8"), value);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, u16) => {
        #[millefeuille]
        pub fn $func_name (mut packet: Packet) -> Packet {
            let value;
            {
                let field = packet.context.get_field(
                    concat!(stringify!($protocol),"::", stringify!($name)));
                value = field.read_u16(0);
            }
            packet.context.set_u16(
                concat!(stringify!($protocol),"::", stringify!($name),"_u16"), value);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, u32) => {
        #[millefeuille]
        pub fn $func_name (mut packet: Packet) -> Packet {
            let value;
            {
                let field = packet.context.get_field(
                    concat!(stringify!($protocol),"::", stringify!($name)));
                value = field.read_u32(0);
            }
            packet.context.set_u32(
                concat!(stringify!($protocol),"::", stringify!($name),"_u32"), value);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, u64) => {
        #[millefeuille]
        pub fn $func_name (mut packet: Packet) -> Packet {
            let value;
            {
                let field = packet.context.get_field(
                    concat!(stringify!($protocol),"::", stringify!($name)));
                value = field.read_u64(0);
            }
            packet.context.set_u64(
                concat!(stringify!($protocol),"::", stringify!($name),"_u64"), value);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, usize) => {
        #[millefeuille]
        pub fn $func_name (mut packet: Packet) -> Packet {
            let value;
            {
                let field = packet.context.get_field(
                    concat!(stringify!($protocol),"::", stringify!($name)));
                value = field.read_usize(0);
            }
            packet.context.set_usize(
                concat!(stringify!($protocol),"::", stringify!($name),"_usize"), value);
            packet
        }
    };
}

#[macro_export]
macro_rules! apply_field_value {
    ($func_name:ident, $protocol:ident, $name:ident, u8) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let mut packet = packet;
            let mut field = packet.context.take_field(
                concat!(stringify!($protocol),"::", stringify!($name)));
            let value = packet.context.get_u8(
                concat!(stringify!($protocol),"::", stringify!($name),"_u8"));
            field.write_u8(0, value);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, u16) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let mut packet = packet;
            let mut field = packet.context.take_field(
                concat!(stringify!($protocol),"::", stringify!($name)));
            let value = packet.context.get_u16(
                concat!(stringify!($protocol),"::", stringify!($name),"_u16"));
            field.write_u16(0, value);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, u32) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let mut packet = packet;
            let mut field = packet.context.take_field(
                concat!(stringify!($protocol),"::", stringify!($name)));
            let value = packet.context.get_u32(
                concat!(stringify!($protocol),"::", stringify!($name),"_u32"));
            field.write_u32(0, value);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, u64) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let mut packet = packet;
            let mut field = packet.context.take_field(
                concat!(stringify!($protocol),"::", stringify!($name)));
            let value = packet.context.get_u64(
                concat!(stringify!($protocol),"::", stringify!($name),"_u64"));
            field.write_u64(0, value);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
    ($func_name:ident, $protocol:ident, $name:ident, usize) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let mut packet = packet;
            let mut field = packet.context.take_field(
                concat!(stringify!($protocol),"::", stringify!($name)));
            let value = packet.context.get_usize(
                concat!(stringify!($protocol),"::", stringify!($name),"_usize"));
            field.write_usize(0, value);
            packet.context.set_field(
                concat!(stringify!($protocol),"::", stringify!($name)), field);
            packet
        }
    };
}

#[macro_export]
macro_rules! alias_protocol {
    ($func_name:ident, $protocol_me:ident, $protocol_super:ident, $($fields: ident),*) => {
        #[millefeuille]
        pub fn $func_name (packet: Packet) -> Packet {
            let mut packet = packet;
            $(packet.context.set_alias(
                    concat!(stringify!($protocol_me),"::", stringify!($fields)),
                    concat!(stringify!($protocol_super),"::", stringify!($fields))
            );)*
            $protocol_super::$func_name(packet)
        }
    };
}