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}