macro_rules! dep_obj {
( $(#[$($a:tt)+])* struct $name:ident
$(< $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ $(,)?>)?
as $id:ty : $type_:ident {
$(
$field:ident : $field_type:ty = $val:expr
),+
$(,)?
}) => { ... };
( $(#[$($a:tt)+])* pub $(($($vis:tt)+))? struct $name:ident
$(< $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ $(,)?>)?
as $id:ty : $type_:ident {
$(
$field:ident : $field_type:ty = $val:expr
),+
$(,)?
}) => { ... };
( $(#[$($a:tt)+])* struct $name:ident
$(< $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ $(,)?>)?
as $id:ty : $type_:ident {
}) => { ... };
( $(#[$($a:tt)+])* pub $(($($vis:tt)+))? struct $name:ident
$(< $( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+ $(,)?>)?
as $id:ty : $type_:ident {
}) => { ... };
( @impl $builder:ident [$(#[$($a:tt)+])*] ($($vis:tt)*) $name:ident as $id:ty : $type_:ident ;
[$($s:tt)*] [$($p:tt)*] [$($c:tt)*] [$($l:tt)*] [$field:ident : $field_type:ty = $val:expr $(, $($tail:tt)+)?];
$([ $($g:tt)+ ], [ $($r:tt)+ ])? ) => { ... };
( @impl $builder:ident [$(#[$($a:tt)+])*] ($($vis:tt)*) $name:ident as $id:ty : $type_:ident ;
[$($s:tt)*] [$($p:tt)*] [$($c:tt)*] [$($l:tt)*] [];
$([ $($g:tt)+ ], [ $($r:tt)+ ])? ) => { ... };
}