macro_rules! fsm {
(
$self_ty:ty,
state = $state:ty,
data = $data:ty,
msg = $msg:ty;
initial state = $init_state:expr, data = $init_data:expr;
$(
($pat_state:pat, $pat_msg:pat) => |$s:ident, $d:ident| ($next:expr, $ndata:expr, $timeout:expr);
)+
) => { ... };
}