- impl_size!(size8, u8);
- impl_size!(size16, u16);
- impl_size!(size32, u32);
- impl_size!(size64, u64);
-
- macro_rules! impl_const {
- ($name:ident) => {
- if let Some(want) = args.$name {
- code = quote! {
- mt_ser::MtDeserialize::mt_deserialize::<mt_ser::DefCfg>(__reader)
- .and_then(|got| {
- if #want == got {
- #code
- } else {
- Err(mt_ser::DeserializeError::InvalidConst(
- #want as u64, got as u64
- ))
- }
- })
- };
+ let impl_const = |value: TokStr| quote! {
+ {
+ fn deserialize_same_type<T: MtDeserialize>(
+ _: &T,
+ reader: &mut impl std::io::Read
+ ) -> Result<T, DeserializeError> {
+ T::mt_deserialize::<mt_ser::DefCfg>(reader)
+ }
+
+ deserialize_same_type(&want, __reader)
+ .and_then(|got| {
+ if want == got {
+ #value
+ } else {
+ Err(mt_ser::DeserializeError::InvalidConst(
+ Box::new(want), Box::new(got)
+ ))
+ }
+ })
+ }
+ };
+
+ for want in args.const_before.iter().rev() {
+ let imp = impl_const(code);
+ code = quote! {
+ {
+ let want = #want;
+ #imp