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