msd 0.4.0

A library for reading and writing MSD files.
Documentation
pub(super) mod key;
pub(super) mod tag;

mod value;

use crate::ser::{Error, Result, WriteExt};
use serde::{ser::SerializeMap, Serialize};
use std::io::Write;

pub(in super::super) struct Serializer<'a, W> {
    writer: &'a mut W,
    written_field: bool,
}

impl<'a, W> Serializer<'a, W> {
    pub(super) fn new(writer: &'a mut W) -> Self {
        Self {
            writer,
            written_field: false,
        }
    }
}

impl<'a, W> SerializeMap for Serializer<'a, W>
where
    W: Write,
{
    type Ok = ();
    type Error = Error;

    fn serialize_key<T>(&mut self, key: &T) -> Result<()>
    where
        T: ?Sized + Serialize,
    {
        self.written_field = true;
        key.serialize(key::Serializer::new(self.writer))
    }

    fn serialize_value<T>(&mut self, value: &T) -> Result<()>
    where
        T: ?Sized + Serialize,
    {
        value.serialize(value::Serializer::new(self.writer))
    }

    fn end(self) -> Result<Self::Ok> {
        if !self.written_field {
            self.writer.close_tag()
        } else {
            Ok(())
        }
    }
}

#[cfg(test)]
mod tests {
    use super::Serializer;
    use claims::assert_ok;
    use serde::ser::SerializeMap;

    #[test]
    fn empty() {
        let mut output = Vec::new();
        let serializer = Serializer::new(&mut output);

        assert_ok!(serializer.end());
        assert_eq!(output, b";\n");
    }

    #[test]
    fn single_entry() {
        let mut output = Vec::new();
        let mut serializer = Serializer::new(&mut output);

        assert_ok!(serializer.serialize_key("foo"));
        assert_ok!(serializer.serialize_value(&42));
        assert_ok!(serializer.end());

        assert_eq!(output, b"   foo:42;\n");
    }

    #[test]
    fn multiple_elements() {
        let mut output = Vec::new();
        let mut serializer = Serializer::new(&mut output);

        assert_ok!(serializer.serialize_key("foo"));
        assert_ok!(serializer.serialize_value(&1));
        assert_ok!(serializer.serialize_key("bar"));
        assert_ok!(serializer.serialize_value(&2));
        assert_ok!(serializer.end());

        assert_eq!(output, b"   foo:1;\n   bar:2;\n");
    }
}