serde_firestore_value/ser/
serializer.rs1use crate::FieldReference;
2use crate::google::firestore::v1::Value;
3use crate::{
4 Reference,
5 error::ErrorCode,
6 ser::{
7 firestore_array_value_serializer::FirestoreArrayValueSerializer,
8 firestore_map_value_serializer::FirestoreMapValueSerializer,
9 },
10 value_ext::ValueExt,
11};
12
13use super::{
14 Error, firestore_field_reference_value_serializer::FirestoreFieldReferenceValueSerializer,
15 firestore_reference_value_serializer::FirestoreReferenceValueSerializer,
16 firestore_value_struct_serializer::FirestoreValueStructSerializer,
17 name_map_value_serializer::NameMapValueSerializer,
18};
19
20#[derive(Debug)]
22pub struct Serializer {
23 _private: (),
24}
25
26impl Serializer {
27 #[allow(clippy::new_without_default)]
29 pub fn new() -> Self {
30 Self { _private: () }
31 }
32}
33
34const MAX_BYTE_LEN: usize = 1_048_487;
36
37impl serde::Serializer for Serializer {
38 type Ok = Value;
39
40 type Error = Error;
41
42 type SerializeSeq = FirestoreArrayValueSerializer;
43
44 type SerializeTuple = FirestoreArrayValueSerializer;
45
46 type SerializeTupleStruct = FirestoreArrayValueSerializer;
47
48 type SerializeTupleVariant = NameMapValueSerializer<FirestoreArrayValueSerializer>;
49
50 type SerializeMap = FirestoreMapValueSerializer;
51
52 type SerializeStruct = FirestoreValueStructSerializer;
53
54 type SerializeStructVariant = NameMapValueSerializer<FirestoreMapValueSerializer>;
55
56 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
57 Ok(Value::from_bool(v))
58 }
59
60 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
61 self.serialize_i64(i64::from(v))
62 }
63
64 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
65 self.serialize_i64(i64::from(v))
66 }
67
68 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
69 self.serialize_i64(i64::from(v))
70 }
71
72 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
73 Ok(Value::from_i64(v))
74 }
75
76 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
77 self.serialize_i64(i64::from(v))
78 }
79
80 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
81 self.serialize_i64(i64::from(v))
82 }
83
84 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
85 self.serialize_i64(i64::from(v))
86 }
87
88 fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
89 Err(Error::from(ErrorCode::U64IsNotSupported))
90 }
91
92 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
93 self.serialize_f64(f64::from(v))
94 }
95
96 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
97 Ok(Value::from_f64(v))
98 }
99
100 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
101 self.serialize_str(&v.to_string())
102 }
103
104 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
105 if v.len() > MAX_BYTE_LEN {
106 return Err(Error::from(ErrorCode::MaximumByteLengthExceeded));
107 }
108 Ok(Value::from_string(v.to_string()))
109 }
110
111 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
112 if v.len() > MAX_BYTE_LEN {
114 return Err(Error::from(ErrorCode::MaximumByteLengthExceeded));
115 }
116 Ok(Value::from_bytes(v.to_vec()))
117 }
118
119 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
120 Ok(Value::null())
121 }
122
123 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
124 where
125 T: ?Sized + serde::Serialize,
126 {
127 value.serialize(self)
128 }
129
130 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
131 Ok(Value::null())
132 }
133
134 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
135 Ok(Value::null())
136 }
137
138 fn serialize_unit_variant(
139 self,
140 _name: &'static str,
141 _variant_index: u32,
142 variant: &'static str,
143 ) -> Result<Self::Ok, Self::Error> {
144 self.serialize_str(variant)
145 }
146
147 fn serialize_newtype_struct<T>(
148 self,
149 name: &'static str,
150 value: &T,
151 ) -> Result<Self::Ok, Self::Error>
152 where
153 T: ?Sized + serde::Serialize,
154 {
155 if name == Reference::NAME {
156 value.serialize(FirestoreReferenceValueSerializer)
157 } else if name == FieldReference::NAME {
158 value.serialize(FirestoreFieldReferenceValueSerializer)
159 } else {
160 value.serialize(Serializer::new())
161 }
162 }
163
164 fn serialize_newtype_variant<T>(
165 self,
166 _name: &'static str,
167 _variant_index: u32,
168 variant: &'static str,
169 value: &T,
170 ) -> Result<Self::Ok, Self::Error>
171 where
172 T: ?Sized + serde::Serialize,
173 {
174 let mut map = self.serialize_map(Some(1))?;
175 serde::ser::SerializeMap::serialize_entry(&mut map, variant, value)?;
176 serde::ser::SerializeMap::end(map)
177 }
178
179 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
180 Ok(Self::SerializeSeq::new(len))
181 }
182
183 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
184 self.serialize_seq(Some(len))
185 }
186
187 fn serialize_tuple_struct(
188 self,
189 _name: &'static str,
190 len: usize,
191 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
192 self.serialize_tuple(len)
193 }
194
195 fn serialize_tuple_variant(
196 self,
197 _name: &'static str,
198 _variant_index: u32,
199 variant: &'static str,
200 len: usize,
201 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
202 Ok(Self::SerializeTupleVariant::new(
203 variant,
204 Self::SerializeSeq::new(Some(len)),
205 ))
206 }
207
208 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
209 Ok(Self::SerializeMap::new(len))
210 }
211
212 fn serialize_struct(
213 self,
214 name: &'static str,
215 len: usize,
216 ) -> Result<Self::SerializeStruct, Self::Error> {
217 Ok(Self::SerializeStruct::new(name, len))
218 }
219
220 fn serialize_struct_variant(
221 self,
222 _name: &'static str,
223 _variant_index: u32,
224 variant: &'static str,
225 len: usize,
226 ) -> Result<Self::SerializeStructVariant, Self::Error> {
227 Ok(Self::SerializeStructVariant::new(
228 variant,
229 Self::SerializeMap::new(Some(len)),
230 ))
231 }
232}