macro_rules! buffer {
($name:ident($($buffer_len:expr)?) { $($field:ident : ($ty:tt, $offset:expr)),* $(,)? }) => { ... };
($name:ident { $($field:ident : ($ty:tt, $offset:expr)),* $(,)? }) => { ... };
($name:ident, buffer_len:expr) => { ... };
($name:ident) => { ... };
}