1use crate::error::Error;
2use crate::value_map::ValueMap;
3use crate::{to_value, Value};
4use base64::prelude::BASE64_STANDARD;
5use base64::Engine;
6use serde::ser::{Impossible, Serialize};
7use std::fmt::Display;
8
9macro_rules! tri {
12 ($e:expr $(,)?) => {
13 match $e {
14 core::result::Result::Ok(val) => val,
15 core::result::Result::Err(err) => return core::result::Result::Err(err),
16 }
17 };
18}
19
20impl Serialize for Value {
21 #[inline]
22 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
23 where
24 S: ::serde::Serializer,
25 {
26 match self {
27 Value::Null => serializer.serialize_unit(),
28 Value::Bool(b) => serializer.serialize_bool(*b),
29 Value::Array(v) => v.serialize(serializer),
30 Value::Map(m) => {
31 use serde::ser::SerializeMap;
32 let mut map = tri!(serializer.serialize_map(Some(m.len())));
33 for (k, v) in m {
34 tri!(map.serialize_entry(k, v));
35 }
36 map.end()
37 }
38 Value::U128(i) => serializer.serialize_u128(*i),
39 Value::I128(i) => serializer.serialize_i128(*i),
40 Value::U64(i) => serializer.serialize_u64(*i),
41 Value::I64(i) => serializer.serialize_i64(*i),
42 Value::U32(i) => serializer.serialize_u32(*i),
43 Value::I32(i) => serializer.serialize_i32(*i),
44 Value::U16(i) => serializer.serialize_u16(*i),
45 Value::I16(i) => serializer.serialize_i16(*i),
46 Value::U8(i) => serializer.serialize_u8(*i),
47 Value::I8(i) => serializer.serialize_i8(*i),
48 Value::Bytes(bytes) => {
49 if serializer.is_human_readable() {
50 serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str())
51 } else {
52 serializer.serialize_bytes(bytes)
53 }
54 }
55 Value::Bytes20(bytes) => {
56 if serializer.is_human_readable() {
57 serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str())
58 } else {
59 serializer.serialize_bytes(bytes)
60 }
61 }
62 Value::Bytes32(bytes) => {
63 if serializer.is_human_readable() {
64 serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str())
65 } else {
66 serializer.serialize_bytes(bytes)
67 }
68 }
69 Value::Bytes36(bytes) => {
70 if serializer.is_human_readable() {
71 serializer.serialize_str(BASE64_STANDARD.encode(bytes).as_str())
72 } else {
73 serializer.serialize_bytes(bytes)
74 }
75 }
76 Value::Identifier(bytes) => {
77 if serializer.is_human_readable() {
78 serializer.serialize_str(bs58::encode(bytes).into_string().as_str())
79 } else {
80 serializer.serialize_bytes(bytes)
81 }
82 }
83 Value::Float(f64) => serializer.serialize_f64(*f64),
84 Value::Text(string) => serializer.serialize_str(string),
85 Value::EnumU8(_x) => todo!(),
86 Value::EnumString(_x) => todo!(),
87 }
88 }
89}
90
91pub struct Serializer;
112
113impl serde::Serializer for Serializer {
114 type Ok = Value;
115 type Error = Error;
116
117 type SerializeSeq = SerializeVec;
118 type SerializeTuple = SerializeVec;
119 type SerializeTupleStruct = SerializeVec;
120 type SerializeTupleVariant = SerializeTupleVariant;
121 type SerializeMap = SerializeMap;
122 type SerializeStruct = SerializeMap;
123 type SerializeStructVariant = SerializeStructVariant;
124
125 #[inline]
126 fn serialize_bool(self, value: bool) -> Result<Value, Error> {
127 Ok(Value::Bool(value))
128 }
129
130 #[inline]
131 fn serialize_i8(self, value: i8) -> Result<Value, Error> {
132 Ok(Value::I8(value))
133 }
134
135 #[inline]
136 fn serialize_i16(self, value: i16) -> Result<Value, Error> {
137 Ok(Value::I16(value))
138 }
139
140 #[inline]
141 fn serialize_i32(self, value: i32) -> Result<Value, Error> {
142 Ok(Value::I32(value))
143 }
144
145 #[inline]
146 fn serialize_i64(self, value: i64) -> Result<Value, Error> {
147 Ok(Value::I64(value))
148 }
149
150 #[inline]
151 fn serialize_i128(self, value: i128) -> Result<Value, Error> {
152 Ok(Value::I128(value))
153 }
154
155 #[inline]
156 fn serialize_u8(self, value: u8) -> Result<Value, Error> {
157 Ok(Value::U8(value))
158 }
159
160 #[inline]
161 fn serialize_u16(self, value: u16) -> Result<Value, Error> {
162 Ok(Value::U16(value))
163 }
164
165 #[inline]
166 fn serialize_u32(self, value: u32) -> Result<Value, Error> {
167 Ok(Value::U32(value))
168 }
169
170 #[inline]
171 fn serialize_u64(self, value: u64) -> Result<Value, Error> {
172 Ok(Value::U64(value))
173 }
174
175 #[inline]
176 fn serialize_u128(self, value: u128) -> Result<Value, Error> {
177 Ok(Value::U128(value))
178 }
179
180 #[inline]
181 fn serialize_f32(self, value: f32) -> Result<Value, Error> {
182 self.serialize_f64(value as f64)
183 }
184
185 #[inline]
186 fn serialize_f64(self, value: f64) -> Result<Value, Error> {
187 Ok(Value::Float(value))
188 }
189
190 #[inline]
191 fn serialize_char(self, value: char) -> Result<Value, Error> {
192 let mut s = String::new();
193 s.push(value);
194 Ok(Value::Text(s))
195 }
196
197 #[inline]
198 fn serialize_str(self, value: &str) -> Result<Value, Error> {
199 Ok(Value::Text(value.to_owned()))
200 }
201
202 #[inline]
203 fn serialize_bytes(self, value: &[u8]) -> Result<Value, Error> {
204 Ok(match value.len() {
205 32 => Value::Bytes32(value.try_into().unwrap()),
206 36 => Value::Bytes36(value.try_into().unwrap()),
207 20 => Value::Bytes20(value.try_into().unwrap()),
208 _ => Value::Bytes(value.to_vec()),
209 })
210 }
211
212 #[inline]
213 fn serialize_unit(self) -> Result<Value, Error> {
214 Ok(Value::Null)
215 }
216
217 #[inline]
218 fn serialize_unit_struct(self, _name: &'static str) -> Result<Value, Error> {
219 self.serialize_unit()
220 }
221
222 #[inline]
223 fn serialize_unit_variant(
224 self,
225 _name: &'static str,
226 _variant_index: u32,
227 variant: &'static str,
228 ) -> Result<Value, Error> {
229 self.serialize_str(variant)
230 }
231
232 #[inline]
233 fn serialize_newtype_struct<T>(self, name: &'static str, value: &T) -> Result<Value, Error>
234 where
235 T: ?Sized + Serialize,
236 {
237 match name {
238 "Identifier" => match value.serialize(self)? {
239 Value::Bytes32(b) => Ok(Value::Identifier(b)),
240 data => {
241 panic!("expected Value::Bytes32, got: {data:#?}")
242 }
243 },
244 _ => value.serialize(self),
245 }
246 }
247
248 fn serialize_newtype_variant<T>(
249 self,
250 _name: &'static str,
251 _variant_index: u32,
252 variant: &'static str,
253 value: &T,
254 ) -> Result<Value, Error>
255 where
256 T: ?Sized + Serialize,
257 {
258 Ok(Value::Map(vec![(
259 Value::Text(String::from(variant)),
260 tri!(to_value(value)),
261 )]))
262 }
263
264 #[inline]
265 fn serialize_none(self) -> Result<Value, Error> {
266 self.serialize_unit()
267 }
268
269 #[inline]
270 fn serialize_some<T>(self, value: &T) -> Result<Value, Error>
271 where
272 T: ?Sized + Serialize,
273 {
274 value.serialize(self)
275 }
276
277 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
278 Ok(SerializeVec {
279 vec: Vec::with_capacity(len.unwrap_or(0)),
280 })
281 }
282
283 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Error> {
284 self.serialize_seq(Some(len))
285 }
286
287 fn serialize_tuple_struct(
288 self,
289 _name: &'static str,
290 len: usize,
291 ) -> Result<Self::SerializeTupleStruct, Error> {
292 self.serialize_seq(Some(len))
293 }
294
295 fn serialize_tuple_variant(
296 self,
297 _name: &'static str,
298 _variant_index: u32,
299 variant: &'static str,
300 len: usize,
301 ) -> Result<Self::SerializeTupleVariant, Error> {
302 Ok(SerializeTupleVariant {
303 name: String::from(variant),
304 vec: Vec::with_capacity(len),
305 })
306 }
307
308 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
309 Ok(SerializeMap::Map {
310 map: Vec::new(),
311 next_key: None,
312 })
313 }
314
315 fn serialize_struct(
316 self,
317 _name: &'static str,
318 len: usize,
319 ) -> Result<Self::SerializeStruct, Error> {
320 self.serialize_map(Some(len))
321 }
322
323 fn serialize_struct_variant(
324 self,
325 _name: &'static str,
326 _variant_index: u32,
327 variant: &'static str,
328 _len: usize,
329 ) -> Result<Self::SerializeStructVariant, Error> {
330 Ok(SerializeStructVariant {
331 name: String::from(variant),
332 map: Vec::new(),
333 })
334 }
335
336 fn collect_str<T>(self, value: &T) -> Result<Value, Error>
337 where
338 T: ?Sized + Display,
339 {
340 Ok(Value::Text(value.to_string()))
341 }
342
343 fn is_human_readable(&self) -> bool {
344 false
345 }
346}
347
348pub struct SerializeVec {
349 vec: Vec<Value>,
350}
351
352pub struct SerializeTupleVariant {
353 name: String,
354 vec: Vec<Value>,
355}
356
357pub enum SerializeMap {
358 Map {
359 map: ValueMap,
360 next_key: Option<String>,
361 },
362}
363
364pub struct SerializeStructVariant {
365 name: String,
366 map: ValueMap,
367}
368
369impl serde::ser::SerializeSeq for SerializeVec {
370 type Ok = Value;
371 type Error = Error;
372
373 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
374 where
375 T: ?Sized + Serialize,
376 {
377 self.vec.push(tri!(to_value(value)));
378 Ok(())
379 }
380
381 fn end(self) -> Result<Value, Error> {
382 Ok(Value::Array(self.vec))
383 }
384}
385
386impl serde::ser::SerializeTuple for SerializeVec {
387 type Ok = Value;
388 type Error = Error;
389
390 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
391 where
392 T: ?Sized + Serialize,
393 {
394 serde::ser::SerializeSeq::serialize_element(self, value)
395 }
396
397 fn end(self) -> Result<Value, Error> {
398 serde::ser::SerializeSeq::end(self)
399 }
400}
401
402impl serde::ser::SerializeTupleStruct for SerializeVec {
423 type Ok = Value;
424 type Error = Error;
425
426 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
427 where
428 T: ?Sized + Serialize,
429 {
430 serde::ser::SerializeSeq::serialize_element(self, value)
431 }
432
433 fn end(self) -> Result<Value, Error> {
434 serde::ser::SerializeSeq::end(self)
435 }
436}
437
438impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
439 type Ok = Value;
440 type Error = Error;
441
442 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
443 where
444 T: ?Sized + Serialize,
445 {
446 self.vec.push(tri!(to_value(value)));
447 Ok(())
448 }
449
450 fn end(self) -> Result<Value, Error> {
451 Ok(Value::Map(vec![(
452 Value::Text(self.name),
453 Value::Array(self.vec),
454 )]))
455 }
456}
457
458impl serde::ser::SerializeMap for SerializeMap {
459 type Ok = Value;
460 type Error = Error;
461
462 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Error>
463 where
464 T: ?Sized + Serialize,
465 {
466 match self {
467 SerializeMap::Map { next_key, .. } => {
468 *next_key = Some(tri!(key.serialize(MapKeySerializer)));
469 Ok(())
470 }
471 }
472 }
473
474 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error>
475 where
476 T: ?Sized + Serialize,
477 {
478 match self {
479 SerializeMap::Map { map, next_key } => {
480 let key = next_key.take();
481 let key = key.expect("serialize_value called before serialize_key");
484 map.push((Value::Text(key), tri!(to_value(value))));
485 Ok(())
486 }
487 }
488 }
489
490 fn end(self) -> Result<Value, Error> {
491 match self {
492 SerializeMap::Map { map, .. } => Ok(Value::Map(map)),
493 }
494 }
495}
496
497struct MapKeySerializer;
498
499fn key_must_be_a_string() -> Error {
500 Error::KeyMustBeAString
501}
502
503impl serde::Serializer for MapKeySerializer {
504 type Ok = String;
505 type Error = Error;
506
507 type SerializeSeq = Impossible<String, Error>;
508 type SerializeTuple = Impossible<String, Error>;
509 type SerializeTupleStruct = Impossible<String, Error>;
510 type SerializeTupleVariant = Impossible<String, Error>;
511 type SerializeMap = Impossible<String, Error>;
512 type SerializeStruct = Impossible<String, Error>;
513 type SerializeStructVariant = Impossible<String, Error>;
514
515 #[inline]
516 fn serialize_unit_variant(
517 self,
518 _name: &'static str,
519 _variant_index: u32,
520 variant: &'static str,
521 ) -> Result<String, Error> {
522 Ok(variant.to_owned())
523 }
524
525 #[inline]
526 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<String, Error>
527 where
528 T: ?Sized + Serialize,
529 {
530 value.serialize(self)
531 }
532
533 fn serialize_bool(self, _value: bool) -> Result<String, Error> {
534 Err(key_must_be_a_string())
535 }
536
537 fn serialize_i8(self, value: i8) -> Result<String, Error> {
538 Ok(value.to_string())
539 }
540
541 fn serialize_i16(self, value: i16) -> Result<String, Error> {
542 Ok(value.to_string())
543 }
544
545 fn serialize_i32(self, value: i32) -> Result<String, Error> {
546 Ok(value.to_string())
547 }
548
549 fn serialize_i64(self, value: i64) -> Result<String, Error> {
550 Ok(value.to_string())
551 }
552
553 fn serialize_u8(self, value: u8) -> Result<String, Error> {
554 Ok(value.to_string())
555 }
556
557 fn serialize_u16(self, value: u16) -> Result<String, Error> {
558 Ok(value.to_string())
559 }
560
561 fn serialize_u32(self, value: u32) -> Result<String, Error> {
562 Ok(value.to_string())
563 }
564
565 fn serialize_u64(self, value: u64) -> Result<String, Error> {
566 Ok(value.to_string())
567 }
568
569 fn serialize_f32(self, _value: f32) -> Result<String, Error> {
570 Err(key_must_be_a_string())
571 }
572
573 fn serialize_f64(self, _value: f64) -> Result<String, Error> {
574 Err(key_must_be_a_string())
575 }
576
577 #[inline]
578 fn serialize_char(self, value: char) -> Result<String, Error> {
579 Ok({
580 let mut s = String::new();
581 s.push(value);
582 s
583 })
584 }
585
586 #[inline]
587 fn serialize_str(self, value: &str) -> Result<String, Error> {
588 Ok(value.to_owned())
589 }
590
591 fn serialize_bytes(self, _value: &[u8]) -> Result<String, Error> {
592 Err(key_must_be_a_string())
593 }
594
595 fn serialize_unit(self) -> Result<String, Error> {
596 Err(key_must_be_a_string())
597 }
598
599 fn serialize_unit_struct(self, _name: &'static str) -> Result<String, Error> {
600 Err(key_must_be_a_string())
601 }
602
603 fn serialize_newtype_variant<T>(
604 self,
605 _name: &'static str,
606 _variant_index: u32,
607 _variant: &'static str,
608 _value: &T,
609 ) -> Result<String, Error>
610 where
611 T: ?Sized + Serialize,
612 {
613 Err(key_must_be_a_string())
614 }
615
616 fn serialize_none(self) -> Result<String, Error> {
617 Err(key_must_be_a_string())
618 }
619
620 fn serialize_some<T>(self, _value: &T) -> Result<String, Error>
621 where
622 T: ?Sized + Serialize,
623 {
624 Err(key_must_be_a_string())
625 }
626
627 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error> {
628 Err(key_must_be_a_string())
629 }
630
631 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Error> {
632 Err(key_must_be_a_string())
633 }
634
635 fn serialize_tuple_struct(
636 self,
637 _name: &'static str,
638 _len: usize,
639 ) -> Result<Self::SerializeTupleStruct, Error> {
640 Err(key_must_be_a_string())
641 }
642
643 fn serialize_tuple_variant(
644 self,
645 _name: &'static str,
646 _variant_index: u32,
647 _variant: &'static str,
648 _len: usize,
649 ) -> Result<Self::SerializeTupleVariant, Error> {
650 Err(key_must_be_a_string())
651 }
652
653 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> {
654 Err(key_must_be_a_string())
655 }
656
657 fn serialize_struct(
658 self,
659 _name: &'static str,
660 _len: usize,
661 ) -> Result<Self::SerializeStruct, Error> {
662 Err(key_must_be_a_string())
663 }
664
665 fn serialize_struct_variant(
666 self,
667 _name: &'static str,
668 _variant_index: u32,
669 _variant: &'static str,
670 _len: usize,
671 ) -> Result<Self::SerializeStructVariant, Error> {
672 Err(key_must_be_a_string())
673 }
674
675 fn collect_str<T>(self, value: &T) -> Result<String, Error>
676 where
677 T: ?Sized + Display,
678 {
679 Ok(value.to_string())
680 }
681}
682
683impl serde::ser::SerializeStruct for SerializeMap {
684 type Ok = Value;
685 type Error = Error;
686
687 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
688 where
689 T: ?Sized + Serialize,
690 {
691 match self {
692 SerializeMap::Map { .. } => serde::ser::SerializeMap::serialize_entry(self, key, value),
693 }
694 }
695
696 fn end(self) -> Result<Value, Error> {
697 match self {
698 SerializeMap::Map { .. } => serde::ser::SerializeMap::end(self),
699 }
700 }
701}
702
703impl serde::ser::SerializeStructVariant for SerializeStructVariant {
704 type Ok = Value;
705 type Error = Error;
706
707 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
708 where
709 T: ?Sized + Serialize,
710 {
711 self.map
712 .push((Value::Text(String::from(key)), tri!(to_value(value))));
713 Ok(())
714 }
715
716 fn end(self) -> Result<Value, Error> {
717 Ok(Value::Map(vec![(
718 Value::Text(self.name),
719 Value::Map(self.map),
720 )]))
721 }
722}
723
724#[cfg(test)]
725#[allow(clippy::approx_constant)]
726mod tests {
727 use super::*;
728 use serde::{Deserialize, Serialize};
729
730 #[test]
735 fn serialize_bool() {
736 assert_eq!(to_value(true).unwrap(), Value::Bool(true));
737 assert_eq!(to_value(false).unwrap(), Value::Bool(false));
738 }
739
740 #[test]
741 fn serialize_i8() {
742 assert_eq!(to_value(-42i8).unwrap(), Value::I8(-42));
743 }
744
745 #[test]
746 fn serialize_i16() {
747 assert_eq!(to_value(-1000i16).unwrap(), Value::I16(-1000));
748 }
749
750 #[test]
751 fn serialize_i32() {
752 assert_eq!(to_value(-100_000i32).unwrap(), Value::I32(-100_000));
753 }
754
755 #[test]
756 fn serialize_i64() {
757 assert_eq!(
758 to_value(-10_000_000_000i64).unwrap(),
759 Value::I64(-10_000_000_000)
760 );
761 }
762
763 #[test]
764 fn serialize_i128() {
765 assert_eq!(to_value(i128::MIN).unwrap(), Value::I128(i128::MIN));
766 }
767
768 #[test]
769 fn serialize_u8() {
770 assert_eq!(to_value(42u8).unwrap(), Value::U8(42));
771 }
772
773 #[test]
774 fn serialize_u16() {
775 assert_eq!(to_value(1000u16).unwrap(), Value::U16(1000));
776 }
777
778 #[test]
779 fn serialize_u32() {
780 assert_eq!(to_value(100_000u32).unwrap(), Value::U32(100_000));
781 }
782
783 #[test]
784 fn serialize_u64() {
785 assert_eq!(
786 to_value(10_000_000_000u64).unwrap(),
787 Value::U64(10_000_000_000)
788 );
789 }
790
791 #[test]
792 fn serialize_u128() {
793 assert_eq!(to_value(u128::MAX).unwrap(), Value::U128(u128::MAX));
794 }
795
796 #[test]
797 fn serialize_f32() {
798 let val = to_value(3.14f32).unwrap();
799 match val {
800 Value::Float(f) => assert!((f - 3.14f32 as f64).abs() < 1e-6),
801 _ => panic!("expected Float"),
802 }
803 }
804
805 #[test]
806 fn serialize_f64() {
807 assert_eq!(to_value(2.718f64).unwrap(), Value::Float(2.718));
808 }
809
810 #[test]
811 fn serialize_char() {
812 let val = to_value('A').unwrap();
813 assert_eq!(val, Value::Text("A".to_string()));
814 }
815
816 #[test]
817 fn serialize_str() {
818 assert_eq!(to_value("hello").unwrap(), Value::Text("hello".to_string()));
819 }
820
821 #[test]
822 fn serialize_string() {
823 assert_eq!(
824 to_value("world".to_string()).unwrap(),
825 Value::Text("world".to_string())
826 );
827 }
828
829 #[test]
834 fn serialize_unit() {
835 assert_eq!(to_value(()).unwrap(), Value::Null);
836 }
837
838 #[test]
839 fn serialize_none() {
840 let val: Option<u32> = None;
841 assert_eq!(to_value(val).unwrap(), Value::Null);
842 }
843
844 #[test]
845 fn serialize_some() {
846 let val: Option<u32> = Some(42);
847 assert_eq!(to_value(val).unwrap(), Value::U32(42));
848 }
849
850 #[test]
855 fn serialize_vec() {
856 let val = to_value(vec![1u32, 2, 3]).unwrap();
857 assert_eq!(
858 val,
859 Value::Array(vec![Value::U32(1), Value::U32(2), Value::U32(3)])
860 );
861 }
862
863 #[test]
864 fn serialize_empty_vec() {
865 let val = to_value(Vec::<u32>::new()).unwrap();
866 assert_eq!(val, Value::Array(vec![]));
867 }
868
869 #[test]
870 fn serialize_tuple() {
871 let val = to_value((1u32, "hello")).unwrap();
872 assert_eq!(
873 val,
874 Value::Array(vec![Value::U32(1), Value::Text("hello".into())])
875 );
876 }
877
878 #[test]
883 fn serialize_hashmap() {
884 let mut map = std::collections::HashMap::new();
885 map.insert("key", 42u32);
886 let val = to_value(map).unwrap();
887 match val {
888 Value::Map(entries) => {
889 assert_eq!(entries.len(), 1);
890 assert_eq!(entries[0].0, Value::Text("key".into()));
891 assert_eq!(entries[0].1, Value::U32(42));
892 }
893 _ => panic!("expected Map"),
894 }
895 }
896
897 #[test]
902 fn serialize_struct() {
903 #[derive(Serialize)]
904 struct Point {
905 x: i32,
906 y: i32,
907 }
908 let val = to_value(Point { x: 10, y: 20 }).unwrap();
909 match val {
910 Value::Map(entries) => {
911 assert_eq!(entries.len(), 2);
912 assert_eq!(entries[0].0, Value::Text("x".into()));
913 assert_eq!(entries[0].1, Value::I32(10));
914 assert_eq!(entries[1].0, Value::Text("y".into()));
915 assert_eq!(entries[1].1, Value::I32(20));
916 }
917 _ => panic!("expected Map"),
918 }
919 }
920
921 #[test]
922 fn serialize_unit_struct() {
923 #[derive(Serialize)]
924 struct Empty;
925 assert_eq!(to_value(Empty).unwrap(), Value::Null);
926 }
927
928 #[test]
929 fn serialize_newtype_struct() {
930 #[derive(Serialize)]
931 struct Wrapper(u32);
932 assert_eq!(to_value(Wrapper(42)).unwrap(), Value::U32(42));
933 }
934
935 #[test]
936 fn serialize_tuple_struct() {
937 #[derive(Serialize)]
938 struct Pair(u32, String);
939 let val = to_value(Pair(1, "two".into())).unwrap();
940 assert_eq!(
941 val,
942 Value::Array(vec![Value::U32(1), Value::Text("two".into())])
943 );
944 }
945
946 #[test]
951 fn serialize_unit_variant() {
952 #[derive(Serialize)]
953 enum Color {
954 Red,
955 }
956 assert_eq!(
957 to_value(Color::Red).unwrap(),
958 Value::Text("Red".to_string())
959 );
960 }
961
962 #[test]
963 fn serialize_newtype_variant() {
964 #[derive(Serialize)]
965 enum Wrapper {
966 Count(u32),
967 }
968 let val = to_value(Wrapper::Count(42)).unwrap();
969 assert_eq!(
970 val,
971 Value::Map(vec![(Value::Text("Count".into()), Value::U32(42))])
972 );
973 }
974
975 #[test]
976 fn serialize_tuple_variant() {
977 #[derive(Serialize)]
978 enum Pair {
979 Coords(i32, i32),
980 }
981 let val = to_value(Pair::Coords(10, 20)).unwrap();
982 assert_eq!(
983 val,
984 Value::Map(vec![(
985 Value::Text("Coords".into()),
986 Value::Array(vec![Value::I32(10), Value::I32(20)])
987 )])
988 );
989 }
990
991 #[test]
992 fn serialize_struct_variant() {
993 #[derive(Serialize)]
994 enum Shape {
995 Circle { radius: u32 },
996 }
997 let val = to_value(Shape::Circle { radius: 5 }).unwrap();
998 assert_eq!(
999 val,
1000 Value::Map(vec![(
1001 Value::Text("Circle".into()),
1002 Value::Map(vec![(Value::Text("radius".into()), Value::U32(5))])
1003 )])
1004 );
1005 }
1006
1007 #[test]
1012 fn serialize_bytes_32_becomes_bytes32() {
1013 let data = [1u8; 32];
1015 use serde::Serializer;
1016 let val = Serializer.serialize_bytes(&data).unwrap();
1017 assert_eq!(val, Value::Bytes32(data));
1018 }
1019
1020 #[test]
1021 fn serialize_bytes_20_becomes_bytes20() {
1022 let data = [2u8; 20];
1023 use serde::Serializer;
1024 let val = Serializer.serialize_bytes(&data).unwrap();
1025 assert_eq!(val, Value::Bytes20(data));
1026 }
1027
1028 #[test]
1029 fn serialize_bytes_36_becomes_bytes36() {
1030 let data = [3u8; 36];
1031 use serde::Serializer;
1032 let val = Serializer.serialize_bytes(&data).unwrap();
1033 assert_eq!(val, Value::Bytes36(data));
1034 }
1035
1036 #[test]
1037 fn serialize_bytes_other_len_becomes_bytes() {
1038 let data = vec![4u8; 10];
1039 use serde::Serializer;
1040 let val = Serializer.serialize_bytes(&data).unwrap();
1041 assert_eq!(val, Value::Bytes(data));
1042 }
1043
1044 #[test]
1049 fn serialize_value_null() {
1050 let val = Value::Null;
1051 let serialized = to_value(&val).unwrap();
1052 assert_eq!(serialized, Value::Null);
1053 }
1054
1055 #[test]
1056 fn serialize_value_bool() {
1057 let val = Value::Bool(true);
1058 let serialized = to_value(&val).unwrap();
1059 assert_eq!(serialized, Value::Bool(true));
1060 }
1061
1062 #[test]
1063 fn serialize_value_integer_types() {
1064 let cases = vec![
1065 Value::U8(1),
1066 Value::I8(-1),
1067 Value::U16(100),
1068 Value::I16(-100),
1069 Value::U32(1000),
1070 Value::I32(-1000),
1071 Value::U64(10000),
1072 Value::I64(-10000),
1073 Value::U128(100000),
1074 Value::I128(-100000),
1075 ];
1076 for val in cases {
1077 let serialized = to_value(&val).unwrap();
1078 assert_eq!(serialized, val);
1079 }
1080 }
1081
1082 #[test]
1083 fn serialize_value_float() {
1084 let val = Value::Float(3.14);
1085 let serialized = to_value(&val).unwrap();
1086 assert_eq!(serialized, Value::Float(3.14));
1087 }
1088
1089 #[test]
1090 fn serialize_value_text() {
1091 let val = Value::Text("hello".into());
1092 let serialized = to_value(&val).unwrap();
1093 assert_eq!(serialized, Value::Text("hello".into()));
1094 }
1095
1096 #[test]
1097 fn serialize_value_array() {
1098 let val = Value::Array(vec![Value::U8(1), Value::U8(2)]);
1099 let serialized = to_value(&val).unwrap();
1100 assert_eq!(serialized, val);
1101 }
1102
1103 #[test]
1104 fn serialize_value_map() {
1105 let val = Value::Map(vec![(Value::Text("k".into()), Value::U32(42))]);
1106 let serialized = to_value(&val).unwrap();
1107 assert_eq!(serialized, val);
1108 }
1109
1110 #[test]
1111 fn serialize_value_bytes() {
1112 let val = Value::Bytes(vec![1, 2, 3, 4, 5]);
1113 let serialized = to_value(&val).unwrap();
1114 assert_eq!(serialized, val);
1116 }
1117
1118 #[test]
1119 fn serialize_value_bytes20() {
1120 let val = Value::Bytes20([1u8; 20]);
1121 let serialized = to_value(&val).unwrap();
1122 assert_eq!(serialized, val);
1124 }
1125
1126 #[test]
1127 fn serialize_value_bytes32() {
1128 let val = Value::Bytes32([2u8; 32]);
1129 let serialized = to_value(&val).unwrap();
1130 assert_eq!(serialized, val);
1131 }
1132
1133 #[test]
1134 fn serialize_value_bytes36() {
1135 let val = Value::Bytes36([3u8; 36]);
1136 let serialized = to_value(&val).unwrap();
1137 assert_eq!(serialized, val);
1138 }
1139
1140 #[test]
1141 fn serialize_value_identifier() {
1142 let val = Value::Identifier([4u8; 32]);
1143 let serialized = to_value(&val).unwrap();
1144 assert_eq!(serialized, Value::Bytes32([4u8; 32]));
1146 }
1147
1148 #[test]
1153 fn map_key_bool_errors() {
1154 let mut map = std::collections::HashMap::new();
1155 map.insert(true, "value");
1156 let result = to_value(map);
1157 assert!(result.is_err());
1158 }
1159
1160 #[test]
1161 fn map_key_string_works() {
1162 let mut map = std::collections::HashMap::new();
1163 map.insert("key".to_string(), 42u32);
1164 let result = to_value(map);
1165 assert!(result.is_ok());
1166 }
1167
1168 #[test]
1169 fn map_key_integer_works() {
1170 let mut map = std::collections::HashMap::new();
1171 map.insert(42u32, "value");
1172 let result = to_value(map);
1173 assert!(result.is_ok());
1174 }
1175
1176 #[test]
1181 fn round_trip_complex_struct() {
1182 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1183 struct Complex {
1184 name: String,
1185 count: u64,
1186 active: bool,
1187 score: f64,
1188 tags: Vec<String>,
1189 metadata: Option<String>,
1190 }
1191
1192 let original = Complex {
1193 name: "test".into(),
1194 count: 42,
1195 active: true,
1196 score: 3.14,
1197 tags: vec!["a".into(), "b".into()],
1198 metadata: Some("info".into()),
1199 };
1200 let val = to_value(&original).unwrap();
1201 let recovered: Complex = crate::from_value(val).unwrap();
1202 assert_eq!(original, recovered);
1203 }
1204
1205 #[test]
1206 fn round_trip_nested() {
1207 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1208 struct Inner {
1209 x: i32,
1210 }
1211 #[derive(Debug, PartialEq, Serialize, Deserialize)]
1212 struct Outer {
1213 inner: Inner,
1214 }
1215
1216 let original = Outer {
1217 inner: Inner { x: -5 },
1218 };
1219 let val = to_value(&original).unwrap();
1220 let recovered: Outer = crate::from_value(val).unwrap();
1221 assert_eq!(original, recovered);
1222 }
1223
1224 #[test]
1225 fn collect_str_produces_text() {
1226 use serde::Serializer;
1227 let val = Serializer.collect_str(&42).unwrap();
1228 assert_eq!(val, Value::Text("42".to_string()));
1229 }
1230}