Skip to main content

reifydb_core/util/encoding/keycode/
serialize.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::error::Error;
5use serde::{
6	Serialize,
7	ser::{Impossible, SerializeSeq, SerializeStructVariant, SerializeTuple, SerializeTupleVariant},
8};
9
10use super::{
11	encode_bool, encode_bytes, encode_f32, encode_f64, encode_i8, encode_i16, encode_i32, encode_i64, encode_i128,
12	encode_u8, encode_u16, encode_u32, encode_u64, encode_u128,
13};
14
15pub(crate) struct Serializer {
16	pub(crate) output: Vec<u8>,
17}
18
19impl serde::ser::Serializer for &mut Serializer {
20	type Ok = ();
21	type Error = Error;
22
23	type SerializeSeq = Self;
24	type SerializeTuple = Self;
25	type SerializeTupleStruct = Impossible<(), Error>;
26	type SerializeTupleVariant = Self;
27	type SerializeMap = Impossible<(), Error>;
28	type SerializeStruct = Impossible<(), Error>;
29	type SerializeStructVariant = Self;
30
31	fn serialize_bool(self, v: bool) -> reifydb_type::Result<()> {
32		self.output.push(encode_bool(v));
33		Ok(())
34	}
35
36	fn serialize_i8(self, v: i8) -> reifydb_type::Result<()> {
37		self.output.extend_from_slice(&encode_i8(v));
38		Ok(())
39	}
40
41	fn serialize_i16(self, v: i16) -> reifydb_type::Result<()> {
42		self.output.extend_from_slice(&encode_i16(v));
43		Ok(())
44	}
45
46	fn serialize_i32(self, v: i32) -> reifydb_type::Result<()> {
47		self.output.extend_from_slice(&encode_i32(v));
48		Ok(())
49	}
50
51	fn serialize_i64(self, v: i64) -> reifydb_type::Result<()> {
52		self.output.extend_from_slice(&encode_i64(v));
53		Ok(())
54	}
55
56	fn serialize_i128(self, v: i128) -> reifydb_type::Result<()> {
57		self.output.extend_from_slice(&encode_i128(v));
58		Ok(())
59	}
60
61	fn serialize_u8(self, v: u8) -> reifydb_type::Result<()> {
62		self.output.push(encode_u8(v));
63		Ok(())
64	}
65
66	fn serialize_u16(self, v: u16) -> reifydb_type::Result<()> {
67		self.output.extend_from_slice(&encode_u16(v));
68		Ok(())
69	}
70
71	fn serialize_u32(self, v: u32) -> reifydb_type::Result<()> {
72		self.output.extend_from_slice(&encode_u32(v));
73		Ok(())
74	}
75
76	fn serialize_u64(self, v: u64) -> reifydb_type::Result<()> {
77		self.output.extend_from_slice(&encode_u64(v));
78		Ok(())
79	}
80
81	fn serialize_u128(self, v: u128) -> reifydb_type::Result<()> {
82		self.output.extend_from_slice(&encode_u128(v));
83		Ok(())
84	}
85
86	fn serialize_f32(self, v: f32) -> reifydb_type::Result<()> {
87		self.output.extend_from_slice(&encode_f32(v));
88		Ok(())
89	}
90
91	fn serialize_f64(self, v: f64) -> reifydb_type::Result<()> {
92		self.output.extend_from_slice(&encode_f64(v));
93		Ok(())
94	}
95
96	fn serialize_char(self, _: char) -> reifydb_type::Result<()> {
97		unimplemented!()
98	}
99
100	fn serialize_str(self, v: &str) -> reifydb_type::Result<()> {
101		self.serialize_bytes(v.as_bytes())
102	}
103
104	fn serialize_bytes(self, v: &[u8]) -> reifydb_type::Result<()> {
105		encode_bytes(v, &mut self.output);
106		Ok(())
107	}
108
109	fn serialize_none(self) -> reifydb_type::Result<()> {
110		self.output.push(0x00);
111		Ok(())
112	}
113
114	fn serialize_some<T: Serialize + ?Sized>(self, value: &T) -> reifydb_type::Result<()> {
115		self.output.push(0x01);
116		value.serialize(self)
117	}
118
119	fn serialize_unit(self) -> reifydb_type::Result<()> {
120		unimplemented!()
121	}
122
123	fn serialize_unit_struct(self, _: &'static str) -> reifydb_type::Result<()> {
124		unimplemented!()
125	}
126
127	fn serialize_unit_variant(self, _: &'static str, index: u32, _: &'static str) -> reifydb_type::Result<()> {
128		self.output.push(index.try_into()?);
129		Ok(())
130	}
131
132	fn serialize_newtype_struct<T: Serialize + ?Sized>(self, _: &'static str, _: &T) -> reifydb_type::Result<()> {
133		unimplemented!()
134	}
135
136	fn serialize_newtype_variant<T: Serialize + ?Sized>(
137		self,
138		name: &'static str,
139		index: u32,
140		variant: &'static str,
141		value: &T,
142	) -> reifydb_type::Result<()> {
143		self.serialize_unit_variant(name, index, variant)?;
144		value.serialize(self)
145	}
146
147	fn serialize_seq(self, _: Option<usize>) -> reifydb_type::Result<Self::SerializeSeq> {
148		Ok(self)
149	}
150
151	fn serialize_tuple(self, _: usize) -> reifydb_type::Result<Self::SerializeTuple> {
152		Ok(self)
153	}
154
155	fn serialize_tuple_struct(self, _: &'static str, _: usize) -> reifydb_type::Result<Self::SerializeTupleStruct> {
156		unimplemented!()
157	}
158
159	fn serialize_tuple_variant(
160		self,
161		name: &'static str,
162		index: u32,
163		variant: &'static str,
164		_: usize,
165	) -> reifydb_type::Result<Self::SerializeTupleVariant> {
166		self.serialize_unit_variant(name, index, variant)?;
167		Ok(self)
168	}
169
170	fn serialize_map(self, _: Option<usize>) -> reifydb_type::Result<Self::SerializeMap> {
171		unimplemented!()
172	}
173
174	fn serialize_struct(self, _: &'static str, _: usize) -> reifydb_type::Result<Self::SerializeStruct> {
175		unimplemented!()
176	}
177
178	fn serialize_struct_variant(
179		self,
180		name: &'static str,
181		index: u32,
182		variant: &'static str,
183		_len: usize,
184	) -> reifydb_type::Result<Self::SerializeStructVariant> {
185		self.serialize_unit_variant(name, index, variant)?;
186		Ok(self)
187	}
188}
189
190impl SerializeSeq for &mut Serializer {
191	type Ok = ();
192	type Error = Error;
193
194	fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> reifydb_type::Result<()> {
195		value.serialize(&mut **self)
196	}
197
198	fn end(self) -> reifydb_type::Result<()> {
199		Ok(())
200	}
201}
202
203impl SerializeTuple for &mut Serializer {
204	type Ok = ();
205	type Error = Error;
206
207	fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> reifydb_type::Result<()> {
208		value.serialize(&mut **self)
209	}
210
211	fn end(self) -> reifydb_type::Result<()> {
212		Ok(())
213	}
214}
215
216impl SerializeTupleVariant for &mut Serializer {
217	type Ok = ();
218	type Error = Error;
219
220	fn serialize_field<T: Serialize + ?Sized>(&mut self, value: &T) -> reifydb_type::Result<()> {
221		value.serialize(&mut **self)
222	}
223
224	fn end(self) -> reifydb_type::Result<()> {
225		Ok(())
226	}
227}
228
229impl SerializeStructVariant for &mut Serializer {
230	type Ok = ();
231	type Error = Error;
232
233	fn serialize_field<T: Serialize + ?Sized>(
234		&mut self,
235		_key: &'static str,
236		value: &T,
237	) -> reifydb_type::Result<()> {
238		value.serialize(&mut **self)
239	}
240
241	fn end(self) -> reifydb_type::Result<()> {
242		Ok(())
243	}
244}