use super::deserializer::DeserializerError;
use crate::prelude::*;
use crate::{BitSequence, Composite, ValueDef};
use serde::{
de::{value::MapDeserializer, MapAccess, Visitor},
ser::SerializeMap,
Serializer,
};
pub static BITVEC_SERDE_IDENT: &str = "__bitvec__values__";
pub fn serialize_bitvec<S>(seq: &BitSequence, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut map = serializer.serialize_map(Some(1))?;
map.serialize_entry(BITVEC_SERDE_IDENT, seq)?;
map.end()
}
pub fn map_access<'de>(seq: BitSequence) -> impl MapAccess<'de, Error = DeserializerError> {
let bools: Vec<bool> = seq.iter().collect();
MapDeserializer::new([(BITVEC_SERDE_IDENT, bools)].into_iter())
}
pub struct MapOrBitSeqVisitor;
impl<'de> Visitor<'de> for MapOrBitSeqVisitor {
type Value = ValueDef<()>;
fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
formatter.write_str(
"a map-like type that can be decoded into a Value::BitSequence or Value::Composite",
)
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
let first_key = match map.next_key::<String>()? {
Some(key) => key,
None => return Ok(ValueDef::Composite(Composite::Named(Vec::new()))),
};
if first_key == BITVEC_SERDE_IDENT {
let bits = map.next_value::<Vec<bool>>()?;
let mut bitvec = BitSequence::new();
for bit in bits {
bitvec.push(bit);
}
return Ok(ValueDef::BitSequence(bitvec));
}
let mut values = Vec::with_capacity(map.size_hint().unwrap_or(0));
values.push((first_key, map.next_value()?));
while let Some(key_val) = map.next_entry()? {
values.push(key_val);
}
Ok(ValueDef::Composite(Composite::Named(values)))
}
}