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}