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