use serde::ser::{SerializeStruct, Serializer};
use crate::Type;
pub struct Serialize<'a, T: Type + serde::Serialize>(pub &'a T);
impl<T: Type + serde::Serialize> serde::Serialize for Serialize<'_, T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut structure = serializer.serialize_struct("Variant", 2)?;
structure.serialize_field("signature", T::SIGNATURE)?;
structure.serialize_field("value", self.0)?;
structure.end()
}
}
impl<T: Type + serde::Serialize> Type for Serialize<'_, T> {
const SIGNATURE: &'static crate::Signature = &crate::Signature::Variant;
}
pub fn serialize<T, S>(value: &T, ser: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
T: Type + serde::Serialize,
{
use serde::Serialize as _;
Serialize(value).serialize(ser)
}
pub fn serialize_optional<T, S>(value: &Option<T>, ser: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
T: Type + serde::Serialize,
{
super::serialize(value.as_ref().unwrap(), ser)
}