use core::marker::PhantomData;
#[macro_export]
macro_rules! args {
(@ifn { $value:expr } $name:ident) => { $value };
(@ifn {} $name:ident) => { $name };
($($name:ident $(: $value:expr)?),* $(,)?) => {
{
let args_ty = ::core::marker::PhantomData::<_>;
if false {
$crate::__private::passthrough_helper(args_ty)
} else {
let builder = $crate::__private::builder_helper(args_ty);
$(let builder = builder.$name($crate::args!(@ifn { $($value)? } $name));)*
builder.finalize()
}
}
};
}
pub trait NamedArgs {
type Builder;
fn builder() -> Self::Builder;
}
#[doc(hidden)]
pub struct Satisfied;
#[doc(hidden)]
pub struct Optional;
#[doc(hidden)]
pub struct Needed;
#[doc(hidden)]
pub trait SatisfiedOrOptional {}
impl SatisfiedOrOptional for Satisfied {}
impl SatisfiedOrOptional for Optional {}
#[doc(hidden)]
#[cfg_attr(coverage_nightly, coverage(off))]
#[must_use]
pub fn passthrough_helper<T>(_a: PhantomData<T>) -> T {
panic!("This is a type system hack and should never be called!");
}
#[doc(hidden)]
#[must_use]
pub fn builder_helper<T: NamedArgs>(_: PhantomData<T>) -> T::Builder {
<T as NamedArgs>::builder()
}