aldrin_core/impls/
option.rs1#[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}