upon 0.10.0

A simple, powerful template engine with minimal dependencies and configurable delimiters
Documentation
use std::collections::BTreeMap;

use serde::ser::Serialize;

use crate::{to_value, Error, Result, Value};

pub struct SerializeTupleVariant {
    pub name: String,
    pub list: Vec<Value>,
}

pub struct SerializeStructVariant {
    pub name: String,
    pub map: BTreeMap<String, Value>,
}

impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
    type Ok = Value;
    type Error = Error;

    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
    where
        T: ?Sized + Serialize,
    {
        self.list.push(to_value(value)?);
        Ok(())
    }

    fn end(self) -> Result<Self::Ok> {
        let mut map = BTreeMap::new();
        map.insert(self.name, Value::List(self.list));
        Ok(Value::Map(map))
    }
}

impl serde::ser::SerializeStructVariant for SerializeStructVariant {
    type Ok = Value;
    type Error = Error;

    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
    where
        T: ?Sized + serde::Serialize,
    {
        self.map.insert(key.into(), to_value(value)?);
        Ok(())
    }

    fn end(self) -> Result<Self::Ok> {
        let mut map = BTreeMap::new();
        map.insert(self.name, Value::Map(self.map));
        Ok(Value::Map(map))
    }
}