+ } else if info.serialize_as_map {
+ let expecting_str = format!("a map from {} to bool", name);
+ quote! {
+ fn serialize<S: #serde::Serializer>(
+ set: #enumset::EnumSet<#name>, ser: S,
+ ) -> #core::result::Result<S::Ok, S::Error> {
+ use #serde::ser::SerializeMap;
+ let mut map = ser.serialize_map(#core::prelude::v1::Some(set.len()))?;
+ for bit in set {
+ map.serialize_entry(&bit, &true)?;
+ }
+ map.end()
+ }
+ fn deserialize<'de, D: #serde::Deserializer<'de>>(
+ de: D,
+ ) -> #core::result::Result<#enumset::EnumSet<#name>, D::Error> {
+ struct Visitor;
+ impl <'de> #serde::de::Visitor<'de> for Visitor {
+ type Value = #enumset::EnumSet<#name>;
+ fn expecting(
+ &self, formatter: &mut #core::fmt::Formatter,
+ ) -> #core::fmt::Result {
+ write!(formatter, #expecting_str)
+ }
+ fn visit_map<A>(
+ mut self, mut map: A,
+ ) -> #core::result::Result<Self::Value, A::Error> where
+ A: #serde::de::MapAccess<'de>
+ {
+ let mut accum = #enumset::EnumSet::<#name>::new();
+ while let #core::prelude::v1::Some((val, true)) = map.next_entry::<#name, bool>()? {
+ accum |= val;
+ }
+ #core::prelude::v1::Ok(accum)
+ }
+ }
+ de.deserialize_map(Visitor)
+ }
+ }