aldrin_core/
impls.rs

1mod bytes;
2mod infallible;
3mod map;
4mod option;
5mod primitive;
6mod result;
7mod set;
8mod string;
9#[cfg(test)]
10mod test;
11mod tuple;
12mod unit;
13mod uuid;
14mod vec;
15
16#[cfg(feature = "introspection")]
17use crate::introspection::{ir, Introspectable, LexicalId, References};
18use crate::tags::{PrimaryTag, Tag};
19use crate::{Deserialize, DeserializeError, Deserializer, Serialize, SerializeError, Serializer};
20use std::borrow::Cow;
21
22impl<T: PrimaryTag + ?Sized> PrimaryTag for &T {
23    type Tag = T::Tag;
24}
25
26impl<T: PrimaryTag + ?Sized> PrimaryTag for &mut T {
27    type Tag = T::Tag;
28}
29
30impl<'a, T, U> Serialize<T> for &&'a U
31where
32    T: Tag,
33    U: ?Sized,
34    &'a U: Serialize<T>,
35{
36    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
37        (*self).serialize(serializer)
38    }
39}
40
41impl<'a, T, U> Serialize<T> for &'a mut U
42where
43    T: Tag,
44    U: ?Sized,
45    &'a U: Serialize<T>,
46{
47    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
48        (&*self).serialize(serializer)
49    }
50}
51
52impl<'a, T, U> Serialize<T> for &'a &mut U
53where
54    T: Tag,
55    U: ?Sized,
56    &'a U: Serialize<T>,
57{
58    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
59        (&**self).serialize(serializer)
60    }
61}
62
63#[cfg(feature = "introspection")]
64impl<T: Introspectable + ?Sized> Introspectable for &T {
65    fn layout() -> ir::LayoutIr {
66        ir::BuiltInTypeIr::Box(T::lexical_id()).into()
67    }
68
69    fn lexical_id() -> LexicalId {
70        LexicalId::box_ty(T::lexical_id())
71    }
72
73    fn add_references(references: &mut References) {
74        references.add::<T>();
75    }
76}
77
78#[cfg(feature = "introspection")]
79impl<T: Introspectable + ?Sized> Introspectable for &mut T {
80    fn layout() -> ir::LayoutIr {
81        ir::BuiltInTypeIr::Box(T::lexical_id()).into()
82    }
83
84    fn lexical_id() -> LexicalId {
85        LexicalId::box_ty(T::lexical_id())
86    }
87
88    fn add_references(references: &mut References) {
89        references.add::<T>();
90    }
91}
92
93impl<T: PrimaryTag + ?Sized> PrimaryTag for Box<T> {
94    type Tag = T::Tag;
95}
96
97impl<T, U> Serialize<T> for Box<U>
98where
99    T: Tag,
100    U: Serialize<T>,
101{
102    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
103        (*self).serialize(serializer)
104    }
105}
106
107impl<'a, T, U> Serialize<T> for &'a Box<U>
108where
109    T: Tag,
110    U: ?Sized,
111    &'a U: Serialize<T>,
112{
113    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
114        (**self).serialize(serializer)
115    }
116}
117
118impl<T, U> Deserialize<T> for Box<U>
119where
120    T: Tag,
121    U: Deserialize<T>,
122{
123    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
124        U::deserialize(deserializer).map(Self::new)
125    }
126}
127
128#[cfg(feature = "introspection")]
129impl<T: Introspectable + ?Sized> Introspectable for Box<T> {
130    fn layout() -> ir::LayoutIr {
131        ir::BuiltInTypeIr::Box(T::lexical_id()).into()
132    }
133
134    fn lexical_id() -> LexicalId {
135        LexicalId::box_ty(T::lexical_id())
136    }
137
138    fn add_references(references: &mut References) {
139        references.add::<T>();
140    }
141}
142
143impl<'a, T> PrimaryTag for Cow<'a, T>
144where
145    T: 'a + ToOwned + PrimaryTag + ?Sized,
146{
147    type Tag = T::Tag;
148}
149
150impl<'a, T, U> Serialize<T> for Cow<'a, U>
151where
152    T: Tag,
153    U: 'a + ToOwned + ?Sized,
154    for<'b> &'b U: Serialize<T>,
155{
156    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
157        serializer.serialize::<T>(self.as_ref())
158    }
159}
160
161impl<'a, 'b, T, U> Serialize<T> for &'a Cow<'b, U>
162where
163    T: Tag,
164    U: 'b + ToOwned + ?Sized,
165    &'a U: Serialize<T>,
166{
167    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
168        serializer.serialize::<T>(self.as_ref())
169    }
170}
171
172impl<'a, T, U> Deserialize<T> for Cow<'a, U>
173where
174    T: Tag,
175    U: 'a + ToOwned + ?Sized,
176    U::Owned: Deserialize<T>,
177{
178    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
179        deserializer.deserialize::<T, _>().map(Self::Owned)
180    }
181}