#[macro_export]
macro_rules! binvalue_map_type {
($b:expr, $t:ident, $e:expr) => (match $b {
$crate::BinType::None => { type $t = $crate::data::BinNone; $e },
$crate::BinType::Bool => { type $t = $crate::data::BinBool; $e },
$crate::BinType::S8 => { type $t = $crate::data::BinS8; $e },
$crate::BinType::U8 => { type $t = $crate::data::BinU8; $e },
$crate::BinType::S16 => { type $t = $crate::data::BinS16; $e },
$crate::BinType::U16 => { type $t = $crate::data::BinU16; $e },
$crate::BinType::S32 => { type $t = $crate::data::BinS32; $e },
$crate::BinType::U32 => { type $t = $crate::data::BinU32; $e },
$crate::BinType::S64 => { type $t = $crate::data::BinS64; $e },
$crate::BinType::U64 => { type $t = $crate::data::BinU64; $e },
$crate::BinType::Float => { type $t = $crate::data::BinFloat; $e },
$crate::BinType::Vec2 => { type $t = $crate::data::BinVec2; $e },
$crate::BinType::Vec3 => { type $t = $crate::data::BinVec3; $e },
$crate::BinType::Vec4 => { type $t = $crate::data::BinVec4; $e },
$crate::BinType::Matrix => { type $t = $crate::data::BinMatrix; $e },
$crate::BinType::Color => { type $t = $crate::data::BinColor; $e },
$crate::BinType::String => { type $t = $crate::data::BinString; $e },
$crate::BinType::Hash => { type $t = $crate::data::BinHash; $e },
$crate::BinType::Path => { type $t = $crate::data::BinPath; $e },
$crate::BinType::List | $crate::BinType::List2 => { type $t = $crate::data::BinList; $e },
$crate::BinType::Struct => { type $t = $crate::data::BinStruct; $e },
$crate::BinType::Embed => { type $t = $crate::data::BinEmbed; $e },
$crate::BinType::Link => { type $t = $crate::data::BinLink; $e },
$crate::BinType::Option => { type $t = $crate::data::BinOption; $e },
$crate::BinType::Map => { type $t = $crate::data::BinMap; $e },
$crate::BinType::Flag => { type $t = $crate::data::BinFlag; $e },
})
}
#[macro_export]
macro_rules! binvalue_map_keytype {
($b:expr, $t:ident, $e:expr) => (match $b {
$crate::BinType::S8 => { type $t = $crate::data::BinS8; $e },
$crate::BinType::U8 => { type $t = $crate::data::BinU8; $e },
$crate::BinType::S16 => { type $t = $crate::data::BinS16; $e },
$crate::BinType::U16 => { type $t = $crate::data::BinU16; $e },
$crate::BinType::S32 => { type $t = $crate::data::BinS32; $e },
$crate::BinType::U32 => { type $t = $crate::data::BinU32; $e },
$crate::BinType::S64 => { type $t = $crate::data::BinS64; $e },
$crate::BinType::U64 => { type $t = $crate::data::BinU64; $e },
$crate::BinType::Float => { type $t = $crate::data::BinFloat; $e },
$crate::BinType::String => { type $t = $crate::data::BinString; $e },
$crate::BinType::Hash => { type $t = $crate::data::BinHash; $e },
_ => panic!("invalid type for map key: {}", $b as u8),
})
}
#[macro_export]
macro_rules! binget {
($e:expr => $($tail:tt)*) => { (|| Some(binget!($e, $($tail)*)))() };
($e:expr, ) => { $e };
($e:expr, . $($tail:tt)*) => { binget!($e, $($tail)*) };
($e:expr, $f:ident($t:ty) $($tail:tt)*) => { binget!($e.getv::<$t>(cdragon_hashes::binh!(stringify!($f)))?, $($tail)*) };
($e:expr, $x:literal($t:ty) $($tail:tt)*) => { binget!($e.getv::<$t>($x.into())?, $($tail)*) };
($e:expr, ($t:ty) $($tail:tt)*) => { binget!($e.downcast::<$t>()?, $($tail)*) };
($e:expr, ($k:ty, $v:ty) $($tail:tt)*) => { binget!($e.downcast::<$k, $v>()?, $($tail)*) };
}