1use indexmap::IndexMap;
2use serde::ser::{
3 SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
4 SerializeTupleStruct, SerializeTupleVariant,
5};
6use serde::{ser, Serialize};
7
8use crate::{Error, Value};
9
10pub fn into_value(v: impl Serialize) -> Result<Value, Error> {
24 v.serialize(Serializer)
25}
26
27pub trait IntoValue {
41 fn into_value(self) -> Result<Value, Error>;
42}
43
44impl<T> IntoValue for T
45where
46 T: Serialize,
47{
48 fn into_value(self) -> Result<Value, Error> {
49 into_value(self)
50 }
51}
52
53impl serde::Serialize for Value {
57 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
58 where
59 S: serde::Serializer,
60 {
61 match self {
62 Value::Bool(v) => s.serialize_bool(*v),
63 Value::I8(v) => s.serialize_i8(*v),
64 Value::I16(v) => s.serialize_i16(*v),
65 Value::I32(v) => s.serialize_i32(*v),
66 Value::I64(v) => s.serialize_i64(*v),
67 Value::I128(v) => s.serialize_i128(*v),
68 Value::U8(v) => s.serialize_u8(*v),
69 Value::U16(v) => s.serialize_u16(*v),
70 Value::U32(v) => s.serialize_u32(*v),
71 Value::U64(v) => s.serialize_u64(*v),
72 Value::U128(v) => s.serialize_u128(*v),
73 Value::F32(v) => s.serialize_f32(*v),
74 Value::F64(v) => s.serialize_f64(*v),
75 Value::Char(v) => s.serialize_char(*v),
76 Value::Str(v) => s.serialize_str(v),
77 Value::Bytes(v) => s.serialize_bytes(v),
78 Value::None => s.serialize_none(),
79 Value::Some(v) => s.serialize_some(v),
80 Value::Unit => s.serialize_unit(),
81 Value::UnitStruct(name) => s.serialize_unit_struct(name),
82 Value::UnitVariant {
83 name,
84 variant_index,
85 variant,
86 } => s.serialize_unit_variant(name, *variant_index, variant),
87 Value::NewtypeStruct(name, value) => s.serialize_newtype_struct(name, value),
88 Value::NewtypeVariant {
89 name,
90 variant_index,
91 variant,
92 value,
93 } => s.serialize_newtype_variant(name, *variant_index, variant, value),
94 Value::Seq(v) => {
95 let mut seq = s.serialize_seq(Some(v.len()))?;
96 for i in v {
97 seq.serialize_element(i)?;
98 }
99 seq.end()
100 }
101 Value::Tuple(v) => {
102 let mut tuple = s.serialize_tuple(v.len())?;
103 for i in v {
104 tuple.serialize_element(i)?;
105 }
106 tuple.end()
107 }
108 Value::TupleStruct(name, fields) => {
109 let mut se = s.serialize_tuple_struct(name, fields.len())?;
110 for i in fields {
111 se.serialize_field(i)?;
112 }
113 se.end()
114 }
115 Value::TupleVariant {
116 name,
117 variant_index,
118 variant,
119 fields,
120 } => {
121 let mut se =
122 s.serialize_tuple_variant(name, *variant_index, variant, fields.len())?;
123 for i in fields {
124 se.serialize_field(i)?;
125 }
126 se.end()
127 }
128 Value::Map(map) => {
129 let mut se = s.serialize_map(Some(map.len()))?;
130 for (k, v) in map {
131 se.serialize_entry(k, v)?;
132 }
133 se.end()
134 }
135 Value::Struct(name, fields) => {
136 let mut se = s.serialize_struct(name, fields.len())?;
137 for (k, v) in fields {
138 se.serialize_field(k, v)?;
139 }
140 se.end()
141 }
142 Value::StructVariant {
143 name,
144 variant_index,
145 variant,
146 fields,
147 } => {
148 let mut se =
149 s.serialize_struct_variant(name, *variant_index, variant, fields.len())?;
150 for (k, v) in fields {
151 se.serialize_field(k, v)?;
152 }
153 se.end()
154 }
155 }
156 }
157}
158
159struct Serializer;
160
161impl serde::Serializer for Serializer {
162 type Ok = Value;
163 type Error = Error;
164 type SerializeSeq = SeqSerializer;
165 type SerializeTuple = TupleSerializer;
166 type SerializeTupleStruct = TupleStructSerializer;
167 type SerializeTupleVariant = TupleVariantSerializer;
168 type SerializeMap = MapSerializer;
169 type SerializeStruct = StructSerializer;
170 type SerializeStructVariant = StructVariantSerializer;
171
172 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
173 Ok(Value::Bool(v))
174 }
175
176 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
177 Ok(Value::I8(v))
178 }
179
180 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
181 Ok(Value::I16(v))
182 }
183
184 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
185 Ok(Value::I32(v))
186 }
187
188 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
189 Ok(Value::I64(v))
190 }
191
192 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
193 Ok(Value::U8(v))
194 }
195
196 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
197 Ok(Value::U16(v))
198 }
199
200 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
201 Ok(Value::U32(v))
202 }
203
204 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
205 Ok(Value::U64(v))
206 }
207
208 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
209 Ok(Value::F32(v))
210 }
211
212 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
213 Ok(Value::F64(v))
214 }
215
216 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
217 Ok(Value::Char(v))
218 }
219
220 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
221 Ok(Value::Str(v.to_string()))
222 }
223
224 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
225 Ok(Value::Bytes(v.to_vec()))
226 }
227
228 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
229 Ok(Value::None)
230 }
231
232 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
233 Ok(Value::Some(Box::new(value.serialize(Serializer)?)))
234 }
235
236 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
237 Ok(Value::Unit)
238 }
239
240 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
241 Ok(Value::UnitStruct(name))
242 }
243
244 fn serialize_unit_variant(
245 self,
246 name: &'static str,
247 variant_index: u32,
248 variant: &'static str,
249 ) -> Result<Self::Ok, Self::Error> {
250 Ok(Value::UnitVariant {
251 name,
252 variant_index,
253 variant,
254 })
255 }
256
257 fn serialize_newtype_struct<T: ?Sized + Serialize>(
258 self,
259 name: &'static str,
260 value: &T,
261 ) -> Result<Self::Ok, Self::Error> {
262 Ok(Value::NewtypeStruct(
263 name,
264 Box::new(value.serialize(Serializer)?),
265 ))
266 }
267
268 fn serialize_newtype_variant<T: ?Sized + Serialize>(
269 self,
270 name: &'static str,
271 variant_index: u32,
272 variant: &'static str,
273 value: &T,
274 ) -> Result<Self::Ok, Self::Error> {
275 Ok(Value::NewtypeVariant {
276 name,
277 variant_index,
278 variant,
279 value: Box::new(value.serialize(Serializer)?),
280 })
281 }
282
283 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
284 Ok(SeqSerializer::new(len))
285 }
286
287 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
288 Ok(TupleSerializer::new(len))
289 }
290
291 fn serialize_tuple_struct(
292 self,
293 name: &'static str,
294 len: usize,
295 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
296 Ok(TupleStructSerializer::new(name, len))
297 }
298
299 fn serialize_tuple_variant(
300 self,
301 name: &'static str,
302 variant_index: u32,
303 variant: &'static str,
304 len: usize,
305 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
306 Ok(TupleVariantSerializer::new(
307 name,
308 variant_index,
309 variant,
310 len,
311 ))
312 }
313
314 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
315 Ok(MapSerializer::new(len))
316 }
317
318 fn serialize_struct(
319 self,
320 name: &'static str,
321 len: usize,
322 ) -> Result<Self::SerializeStruct, Self::Error> {
323 Ok(StructSerializer::new(name, len))
324 }
325
326 fn serialize_struct_variant(
327 self,
328 name: &'static str,
329 variant_index: u32,
330 variant: &'static str,
331 len: usize,
332 ) -> Result<Self::SerializeStructVariant, Self::Error> {
333 Ok(StructVariantSerializer::new(
334 name,
335 variant_index,
336 variant,
337 len,
338 ))
339 }
340}
341
342struct SeqSerializer {
343 elements: Vec<Value>,
344}
345
346impl SeqSerializer {
347 pub fn new(len: Option<usize>) -> Self {
348 Self {
349 elements: Vec::with_capacity(len.unwrap_or_default()),
350 }
351 }
352}
353
354impl ser::SerializeSeq for SeqSerializer {
355 type Ok = Value;
356 type Error = Error;
357
358 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
359 self.elements.push(value.serialize(Serializer)?);
360
361 Ok(())
362 }
363
364 fn end(self) -> Result<Self::Ok, Self::Error> {
365 Ok(Value::Seq(self.elements))
366 }
367}
368
369struct TupleSerializer {
370 elements: Vec<Value>,
371}
372
373impl TupleSerializer {
374 pub fn new(len: usize) -> Self {
375 Self {
376 elements: Vec::with_capacity(len),
377 }
378 }
379}
380
381impl ser::SerializeTuple for TupleSerializer {
382 type Ok = Value;
383 type Error = Error;
384
385 fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
386 self.elements.push(value.serialize(Serializer)?);
387
388 Ok(())
389 }
390
391 fn end(self) -> Result<Self::Ok, Self::Error> {
392 Ok(Value::Tuple(self.elements))
393 }
394}
395
396struct TupleStructSerializer {
397 name: &'static str,
398 fields: Vec<Value>,
399}
400
401impl TupleStructSerializer {
402 pub fn new(name: &'static str, len: usize) -> Self {
403 Self {
404 name,
405 fields: Vec::with_capacity(len),
406 }
407 }
408}
409
410impl ser::SerializeTupleStruct for TupleStructSerializer {
411 type Ok = Value;
412 type Error = Error;
413
414 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
415 self.fields.push(value.serialize(Serializer)?);
416
417 Ok(())
418 }
419
420 fn end(self) -> Result<Self::Ok, Self::Error> {
421 Ok(Value::TupleStruct(self.name, self.fields))
422 }
423}
424
425struct TupleVariantSerializer {
426 name: &'static str,
427 variant_index: u32,
428 variant: &'static str,
429 fields: Vec<Value>,
430}
431
432impl TupleVariantSerializer {
433 pub fn new(name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Self {
434 Self {
435 name,
436 variant_index,
437 variant,
438 fields: Vec::with_capacity(len),
439 }
440 }
441}
442
443impl ser::SerializeTupleVariant for TupleVariantSerializer {
444 type Ok = Value;
445 type Error = Error;
446
447 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
448 self.fields.push(value.serialize(Serializer)?);
449
450 Ok(())
451 }
452
453 fn end(self) -> Result<Self::Ok, Self::Error> {
454 Ok(Value::TupleVariant {
455 name: self.name,
456 variant_index: self.variant_index,
457 variant: self.variant,
458 fields: self.fields,
459 })
460 }
461}
462
463struct MapSerializer {
464 cache_key: Option<Value>,
465 entries: IndexMap<Value, Value>,
466}
467
468impl MapSerializer {
469 pub fn new(len: Option<usize>) -> Self {
470 Self {
471 cache_key: None,
472 entries: IndexMap::with_capacity(len.unwrap_or_default()),
473 }
474 }
475}
476
477impl ser::SerializeMap for MapSerializer {
478 type Ok = Value;
479 type Error = Error;
480
481 fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), Self::Error> {
482 debug_assert!(
483 self.cache_key.is_none(),
484 "value for the last entry is missing"
485 );
486 self.cache_key = Some(key.serialize(Serializer)?);
487
488 Ok(())
489 }
490
491 fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), Self::Error> {
492 let key = self
493 .cache_key
494 .take()
495 .expect("key for current entry is missing");
496 self.entries.insert(key, value.serialize(Serializer)?);
497
498 Ok(())
499 }
500
501 fn end(self) -> Result<Self::Ok, Self::Error> {
502 Ok(Value::Map(self.entries))
503 }
504}
505
506struct StructSerializer {
507 name: &'static str,
508 fields: IndexMap<&'static str, Value>,
509}
510
511impl StructSerializer {
512 pub fn new(name: &'static str, len: usize) -> Self {
513 Self {
514 name,
515 fields: IndexMap::with_capacity(len),
516 }
517 }
518}
519
520impl ser::SerializeStruct for StructSerializer {
521 type Ok = Value;
522 type Error = Error;
523
524 fn serialize_field<T: ?Sized + Serialize>(
525 &mut self,
526 key: &'static str,
527 value: &T,
528 ) -> Result<(), Self::Error> {
529 self.fields.insert(key, value.serialize(Serializer)?);
530
531 Ok(())
532 }
533
534 fn end(self) -> Result<Self::Ok, Self::Error> {
535 Ok(Value::Struct(self.name, self.fields))
536 }
537}
538
539struct StructVariantSerializer {
540 name: &'static str,
541 variant_index: u32,
542 variant: &'static str,
543 fields: IndexMap<&'static str, Value>,
544}
545
546impl StructVariantSerializer {
547 pub fn new(name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Self {
548 Self {
549 name,
550 variant_index,
551 variant,
552 fields: IndexMap::with_capacity(len),
553 }
554 }
555}
556
557impl ser::SerializeStructVariant for StructVariantSerializer {
558 type Ok = Value;
559 type Error = Error;
560
561 fn serialize_field<T: ?Sized + Serialize>(
562 &mut self,
563 key: &'static str,
564 value: &T,
565 ) -> Result<(), Self::Error> {
566 self.fields.insert(key, value.serialize(Serializer)?);
567
568 Ok(())
569 }
570
571 fn end(self) -> Result<Self::Ok, Self::Error> {
572 Ok(Value::StructVariant {
573 name: self.name,
574 variant_index: self.variant_index,
575 variant: self.variant,
576 fields: self.fields,
577 })
578 }
579}
580
581#[cfg(test)]
582mod tests {
583 use anyhow::Result;
584 use indexmap::indexmap;
585
586 use super::*;
587
588 #[derive(serde::Serialize)]
589 struct TestStruct {
590 a: bool,
591 b: i32,
592 c: u64,
593 d: String,
594 e: f64,
595 }
596
597 #[test]
598 fn test_to_value() {
599 assert_eq!(into_value(128).expect("must success"), Value::I32(128));
600 assert_eq!(into_value(128_u64).expect("must success"), Value::U64(128));
601
602 assert_eq!(
603 into_value(TestStruct {
604 a: true,
605 b: 1,
606 c: 2,
607 d: "Hello, World!".to_string(),
608 e: 4.5
609 })
610 .expect("must success"),
611 Value::Struct(
612 "TestStruct",
613 indexmap! {
614 "a" => Value::Bool(true),
615 "b" => Value::I32(1),
616 "c" => Value::U64(2),
617 "d" => Value::Str("Hello, World!".to_string()),
618 "e" => Value::F64(4.5)
619 }
620 )
621 )
622 }
623
624 #[test]
625 fn test_serialize() -> Result<()> {
626 let raw = TestStruct {
627 a: true,
628 b: 1,
629 c: 2,
630 d: "Hello, World!".to_string(),
631 e: 4.5,
632 };
633 let value = Value::Struct(
634 "TestStruct",
635 indexmap! {
636 "a" => Value::Bool(true),
637 "b" => Value::I32(1),
638 "c" => Value::U64(2),
639 "d" => Value::Str("Hello, World!".to_string()),
640 "e" => Value::F64(4.5)
641 },
642 );
643
644 assert_eq!(serde_json::to_string(&raw)?, serde_json::to_string(&value)?);
645
646 Ok(())
647 }
648}