aldrin_core/impls/
option.rs

1#[cfg(feature = "introspection")]
2use crate::introspection::{ir, Introspectable, LexicalId, References};
3use crate::tags::{self, PrimaryTag, Tag};
4use crate::{Deserialize, DeserializeError, Deserializer, Serialize, SerializeError, Serializer};
5
6impl<T: PrimaryTag> PrimaryTag for Option<T> {
7    type Tag = tags::Option<T::Tag>;
8}
9
10impl<T: Tag, U: Serialize<T>> Serialize<tags::Option<T>> for Option<U> {
11    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
12        match self {
13            Self::Some(value) => serializer.serialize_some(value),
14            Self::None => serializer.serialize_none(),
15        }
16    }
17
18    fn serializes_as_some(&self) -> bool {
19        self.is_some()
20    }
21}
22
23impl<'a, T, U> Serialize<tags::Option<T>> for &'a Option<U>
24where
25    T: Tag,
26    &'a U: Serialize<T>,
27{
28    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
29        match self {
30            Option::Some(value) => serializer.serialize_some(value),
31            Option::None => serializer.serialize_none(),
32        }
33    }
34
35    fn serializes_as_some(&self) -> bool {
36        self.is_some()
37    }
38}
39
40impl<T: Tag, U: Deserialize<T>> Deserialize<tags::Option<T>> for Option<U> {
41    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
42        deserializer.deserialize_option()
43    }
44}
45
46impl<T: Tag> Serialize<tags::Option<T>> for () {
47    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
48        serializer.serialize_none()
49    }
50
51    fn serializes_as_some(&self) -> bool {
52        false
53    }
54}
55
56impl<T: Tag> Serialize<tags::Option<T>> for &() {
57    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
58        serializer.serialize_none()
59    }
60
61    fn serializes_as_some(&self) -> bool {
62        false
63    }
64}
65
66impl<T: Tag> Deserialize<tags::Option<T>> for () {
67    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
68        deserializer.deserialize_none()
69    }
70}
71
72#[cfg(feature = "introspection")]
73impl<T: Introspectable> Introspectable for Option<T> {
74    fn layout() -> ir::LayoutIr {
75        ir::BuiltInTypeIr::Option(T::lexical_id()).into()
76    }
77
78    fn lexical_id() -> LexicalId {
79        LexicalId::option(T::lexical_id())
80    }
81
82    fn add_references(references: &mut References) {
83        references.add::<T>();
84    }
85}