avm1_types/
bitflags.rs

1
2macro_rules! serde_bitflags {
3  (
4    $(#[$outer:meta])*
5    $vis:vis struct $BitFlags:ident: $T:ty {
6        $(
7            #[serde(name = $serde:literal)]
8            $(#[$inner:ident $($args:tt)*])*
9            const $Flag:ident = $value:expr;
10        )*
11    }
12  ) => {
13    ::bitflags::bitflags! {
14      $(#[$outer])*
15      $vis struct $BitFlags: $T {
16        $(
17          $(#[$inner $($args)*])*
18          const $Flag = $value;
19        )*
20      }
21    }
22
23    #[cfg(feature = "serde")]
24    impl ::serde::Serialize for $BitFlags {
25      fn serialize<S: ::serde::Serializer>(&self, ser: S) -> Result<S::Ok, S::Error> {
26        use ::serde::ser::SerializeStruct;
27
28        const NB_FLAGS: usize = [$($serde),*].len();
29        let mut map = ser.serialize_struct(stringify!($BitFlags), NB_FLAGS)?;
30        $(
31          map.serialize_field($serde, &self.contains($BitFlags::$Flag))?;
32        )*
33        map.end()
34      }
35    }
36
37    #[cfg(feature = "serde")]
38    impl<'de> ::serde::Deserialize<'de> for $BitFlags {
39      fn deserialize<D: ::serde::Deserializer<'de>>(de: D) -> Result<Self, D::Error> {
40        #[derive(::serde::Deserialize)]
41        #[allow(non_snake_case)]
42        struct $BitFlags {
43          $(
44            #[serde(rename = $serde)]
45            $Flag: bool,
46          )*
47        }
48
49        let flags = <$BitFlags as ::serde::Deserialize>::deserialize(de)?;
50
51        let mut out = Self::empty();
52        $(
53          if flags.$Flag {
54            out.insert(Self::$Flag);
55          }
56        )*
57        Ok(out)
58      }
59    }
60  }
61}