deser 0.9.0

An experimental serialization and deserialization library for Rust
Documentation
use deser::Error;
use deser::State;
use deser::ser::{Chunk, MapEmitter, Serialize, SerializeDriver, SerializeHandle};
use std::collections::{BTreeMap, btree_map};

struct Flags(BTreeMap<u64, bool>);

impl Serialize for Flags {
    fn serialize(&self, state: &mut State) -> Result<Chunk<'_>, Error> {
        Ok(Chunk::map(
            FlagsMapEmitter {
                iter: self.0.iter(),
                value: None,
            },
            state,
        ))
    }
}

pub struct FlagsMapEmitter<'a> {
    iter: btree_map::Iter<'a, u64, bool>,
    value: Option<&'a bool>,
}

impl<'a> MapEmitter for FlagsMapEmitter<'a> {
    fn next_key(&mut self, state: &mut State) -> Result<Option<SerializeHandle<'_>>, Error> {
        Ok(if let Some((key, value)) = self.iter.next() {
            self.value = Some(value);
            Some(SerializeHandle::arena(key.to_string(), state))
        } else {
            None
        })
    }

    fn next_value(&mut self, _state: &mut State) -> Result<SerializeHandle<'_>, Error> {
        Ok(SerializeHandle::to(self.value.unwrap()))
    }
}

#[test]
fn test_as_string_map() {
    let mut events = Vec::new();
    let flags = Flags({
        let mut map = BTreeMap::new();
        map.insert(0, true);
        map.insert(1, true);
        map.insert(2, false);
        map
    });
    let mut driver = SerializeDriver::new(&flags);
    while let Some((event, _, _)) = driver.next().unwrap() {
        events.push(format!("{:?}", event));
    }

    assert_eq!(
        events,
        vec![
            "MapStart",
            "Atom(Str(\"0\"))",
            "Atom(Bool(true))",
            "Atom(Str(\"1\"))",
            "Atom(Bool(true))",
            "Atom(Str(\"2\"))",
            "Atom(Bool(false))",
            "MapEnd"
        ]
    );
}