#[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)
}
};
}