#[macro_export]
macro_rules! bind {
($D:tt $g:ident, declare_const) => {
$crate::bind!($D $g, declare_const, declare_const);
};
($D:tt $g:ident, declare_fn) => {
$crate::bind!($D $g, declare_fn, declare_fn);
};
($D:tt $g:ident, declare_const, $macro:ident) => {
macro_rules! $macro {
($vis:vis $name:ident, $ty:ty, $val:expr $D(,)?) => {
if ::core::stringify!($vis) == "pub" {
$g.public().space();
}
$g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
};
($vis:vis $name:ident, $ty:expr, $val:expr $D(,)?) => {
if ::core::stringify!($vis) == "pub" {
$g.public().space();
}
$g.declare_const(::core::stringify!($name), $ty, $val)
};
($name:expr, $ty:ty, $val:expr $D(,)?) => {
$g.declare_const($name, ::core::stringify!($ty), $val)
};
($name:expr, $ty:expr, $val:expr $D(,)?) => {
$g.declare_const($name, $ty, $val)
};
($vis:vis $name:ident: $ty:ty, $val:expr $D(,)?) => {
if ::core::stringify!($vis) == "pub" {
$g.public().space();
}
$g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
};
($vis:vis $name:ident: $ty:expr, $val:expr $D(,)?) => {
if ::core::stringify!($vis) == "pub" {
$g.public().space();
}
$g.declare_const(::core::stringify!($name), $ty, $val)
};
($vis:vis $name:ident, $ty:ty = $val:expr $D(,)?) => {
if ::core::stringify!($vis) == "pub" {
$g.public().space();
}
$g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
};
($name:expr, $ty:ty = $val:expr $D(,)?) => {
$g.declare_const($name, ::core::stringify!($ty), $val)
};
($vis:vis $name:ident: $ty:ty = $val:expr $D(,)?) => {
if ::core::stringify!($vis) == "pub" {
$g.public().space();
}
$g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
};
}
};
($D:tt $g:ident, declare_fn, $macro:ident) => {
macro_rules! $macro {
($name:ident ($D($params:tt)*) -> $ret:ty, $body:expr $D(,)?) => {
$g.declare_fn(
::core::stringify!($name),
::core::stringify!($D($params)*),
::core::stringify!($ret),
$body,
)
};
($name:ident ($D($params:tt)*) -> $ret:expr, $body:expr $D(,)?) => {
$g.declare_fn(::core::stringify!($name), ::core::stringify!($D($params)*), $ret, $body)
};
($name:ident ($D($params:tt)*), $ret:ty, $body:expr $D(,)?) => {
$g.declare_fn(
::core::stringify!($name),
::core::stringify!($D($params)*),
::core::stringify!($ret),
$body,
)
};
($name:ident, $params:expr, $ret:ty, $body:expr $D(,)?) => {
$g.declare_fn(::core::stringify!($name), $params, ::core::stringify!($ret), $body)
};
($name:ident, $params:expr, $ret:expr, $body:expr $D(,)?) => {
$g.declare_fn(::core::stringify!($name), $params, $ret, $body)
};
($name:ident ($D($params:tt)*), $ret:expr, $body:expr $D(,)?) => {
$g.declare_fn(::core::stringify!($name), ::core::stringify!($D($params)*), $ret, $body)
};
($name:expr, $params:expr, $ret:ty, $body:expr $D(,)?) => {
$g.declare_fn($name, $params, ::core::stringify!($ret), $body)
};
($name:expr, $params:expr, $ret:expr, $body:expr $D(,)?) => {
$g.declare_fn($name, $params, $ret, $body)
};
}
}
}