zvariant/as_value/
serialize.rs1use serde::ser::{SerializeStruct, Serializer};
2
3use crate::Type;
4
5pub struct Serialize<'a, T: Type + serde::Serialize>(pub &'a T);
19
20impl<T: Type + serde::Serialize> serde::Serialize for Serialize<'_, T> {
21 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22 where
23 S: Serializer,
24 {
25 let mut structure = serializer.serialize_struct("Variant", 2)?;
27
28 structure.serialize_field("signature", T::SIGNATURE)?;
29 structure.serialize_field("value", self.0)?;
30
31 structure.end()
32 }
33}
34
35impl<T: Type + serde::Serialize> Type for Serialize<'_, T> {
36 const SIGNATURE: &'static crate::Signature = &crate::Signature::Variant;
37}
38
39pub fn serialize<T, S>(value: &T, ser: S) -> std::result::Result<S::Ok, S::Error>
41where
42 S: Serializer,
43 T: Type + serde::Serialize,
44{
45 use serde::Serialize as _;
46
47 Serialize(value).serialize(ser)
48}
49
50pub fn serialize_optional<T, S>(value: &Option<T>, ser: S) -> std::result::Result<S::Ok, S::Error>
52where
53 S: Serializer,
54 T: Type + serde::Serialize,
55{
56 super::serialize(value.as_ref().unwrap(), ser)
57}