#[macro_export]
macro_rules! capture {
(@data, *$from:expr => mut $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $to $(: $ty )? = *$from;
$crate::capture!(@data, $( $tt )* )
};
(@data, *$from:expr => $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let $to $(: $ty )? = *$from;
$crate::capture!(@data, $( $tt )* )
};
(@data, *$from:expr => mut $to:ident $(: $ty:ty)? ) => {
let mut $to $(: $ty )? = *$from;
};
(@data, *$from:expr => $to:ident $(: $ty:ty)? ) => {
let $to $(: $ty )? = *$from;
};
(@data, mut *$v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $v $(: $ty )? = *$v;
$crate::capture!(@data, $( $tt )* )
};
(@data, *$v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let $v $(: $ty )? = *$v;
$crate::capture!(@data, $( $tt )* )
};
(@data, mut *$v:ident $(: $ty:ty)? ) => {
let mut $v $(: $ty )? = *$v;
};
(@data, *$v:ident $(: $ty:ty)? ) => {
let $v $(: $ty )? = *$v;
};
(@data, ref mut $from:expr => mut $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $to $(: $ty )? = &mut $from;
$crate::capture!(@data, $( $tt )* )
};
(@data, ref mut $from:expr => $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let $to $(: $ty )? = &mut $from;
$crate::capture!(@data, $( $tt )* )
};
(@data, ref $from:expr => mut $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $to $(: $ty )? = &$from;
$crate::capture!(@data, $( $tt )* )
};
(@data, ref $from:expr => $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let $to $(: $ty )? = &$from;
$crate::capture!(@data, $( $tt )* )
};
(@data, ref mut $from:expr => mut $to:ident $(: $ty:ty)? ) => {
let mut $to $(: $ty )? = &mut $from;
};
(@data, ref mut $from:expr => $to:ident $(: $ty:ty)? ) => {
let $to $(: $ty )? = &mut $from;
};
(@data, ref $from:expr => mut $to:ident $(: $ty:ty)? ) => {
let mut $to $(: $ty )? = &$from;
};
(@data, ref $from:expr => $to:ident $(: $ty:ty)? ) => {
let $to $(: $ty )? = &$from;
};
(@data, mut ref mut $v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $v $(: $ty )? = &mut $v;
$crate::capture!(@data, $( $tt )* )
};
(@data, mut ref $v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $v $(: $ty )? = &$v;
$crate::capture!(@data, $( $tt )* )
};
(@data, ref mut $v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $v $(: $ty )? = &$v;
$crate::capture!(@data, $( $tt )* )
};
(@data, ref $v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let $v $(: $ty )? = &$v;
$crate::capture!(@data, $( $tt )* )
};
(@data, mut ref mut $v:ident $(: $ty:ty)? ) => {
let mut $v $(: $ty )? = &mut $v;
};
(@data, mut ref $v:ident $(: $ty:ty)? ) => {
let mut $v $(: $ty )? = &$v;
};
(@data, ref mut $v:ident $(: $ty:ty)? ) => {
let $v $(: $ty )? = &mut $v;
};
(@data, ref $v:ident $(: $ty:ty)? ) => {
let $v $(: $ty )? = &$v;
};
(@data, $from:expr => mut $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $to $(: $ty )? = $from.clone();
$crate::capture!(@data, $( $tt )* )
};
(@data, $from:expr => $to:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let $to $(: $ty )? = $from.clone();
$crate::capture!(@data, $( $tt )* )
};
(@data, $from:expr => mut $to:ident $(: $ty:ty)? ) => {
let mut $to $(: $ty )? = $from.clone();
};
(@data, $from:expr => $to:ident $(: $ty:ty)? ) => {
let $to $(: $ty )? = $from.clone();
};
(@data, mut $v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let mut $v $(: $ty )? = $v.clone();
$crate::capture!(@data, $( $tt )* )
};
(@data, $v:ident $(: $ty:ty)?, $( $tt:tt )* ) => {
let $v $(: $ty )? = $v.clone();
$crate::capture!(@data, $( $tt )* )
};
(@data, mut $v:ident $(: $ty:ty)? ) => {
let mut $v $(: $ty )? = $v.clone();
};
(@data, $v:ident $(: $ty:ty)? ) => {
let $v $(: $ty )? = $v.clone();
};
(@data,) => {};
( $( $var_tt:tt )* ) => {
$crate::capture! { @data, $( $var_tt )* }
};
}