flow-value 0.3.0

Value type for flow inputs and outputs.
Documentation
use super::map_key::MapKeySerializer;
use super::seq::SerializeSeq;
use crate::{Error, Map, Value};

pub struct SerializeTupleVariant {
    pub name: &'static str,
    pub seq: SerializeSeq,
}

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

    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
    where
        T: ?Sized + serde::Serialize,
    {
        use serde::ser::SerializeTuple;
        self.seq.serialize_element(value)?;
        Ok(())
    }

    fn end(self) -> Result<Value, Error> {
        use serde::ser::SerializeTuple;
        let key = crate::Key::from(self.name);
        let value = self.seq.end()?;
        Ok(Value::Map(Map::from([(key, value)])))
    }
}

pub struct SerializeStructVariant {
    pub name: &'static str,
    pub 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<(), Error>
    where
        T: ?Sized + serde::Serialize,
    {
        let value = value.serialize(super::Serializer)?;
        self.map.insert(crate::Key::from(key), value);
        Ok(())
    }

    fn end(self) -> Result<Value, Error> {
        Ok(Value::Map(Map::from([(
            crate::Key::from(self.name),
            Value::Map(self.map),
        )])))
    }
}

pub struct SerializeMap {
    pub map: Map,
    pub next_key: Option<crate::Key>,
}

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

    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Error>
    where
        T: ?Sized + serde::Serialize,
    {
        self.next_key = Some(key.serialize(MapKeySerializer)?);
        Ok(())
    }

    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error>
    where
        T: ?Sized + serde::Serialize,
    {
        let key = self
            .next_key
            .take()
            .expect("serialize_value called before serialize_key");
        let value = value.serialize(super::Serializer)?;
        self.map.insert(key, value);
        Ok(())
    }

    fn end(self) -> Result<Value, Error> {
        Ok(Value::Map(self.map))
    }
}

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

    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
    where
        T: ?Sized + serde::Serialize,
    {
        serde::ser::SerializeMap::serialize_entry(self, key, value)
    }

    fn end(self) -> Result<Value, Error> {
        serde::ser::SerializeMap::end(self)
    }
}