1use super::{CandidType, Serializer, Type, TypeInner};
4use serde::de::{self, Deserialize, Deserializer, Visitor};
5use serde::Serialize;
6use std::fmt;
7
8#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, PartialOrd, Ord, Hash)]
9pub struct Reserved;
10#[derive(PartialEq, Eq, Debug)]
11pub enum Empty {}
12
13impl CandidType for Reserved {
14 fn _ty() -> Type {
15 TypeInner::Reserved.into()
16 }
17 fn idl_serialize<S>(&self, serializer: S) -> Result<(), S::Error>
18 where
19 S: Serializer,
20 {
21 serializer.serialize_null(())
22 }
23}
24
25impl CandidType for Empty {
26 fn _ty() -> Type {
27 TypeInner::Empty.into()
28 }
29 fn idl_serialize<S>(&self, serializer: S) -> Result<(), S::Error>
30 where
31 S: Serializer,
32 {
33 serializer.serialize_empty()
34 }
35}
36
37impl Serialize for Reserved {
38 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
39 where
40 S: serde::Serializer,
41 {
42 serializer.serialize_none()
43 }
44}
45
46impl<'de> Deserialize<'de> for Reserved {
47 fn deserialize<D>(deserializer: D) -> Result<Reserved, D::Error>
48 where
49 D: Deserializer<'de>,
50 {
51 deserializer
52 .deserialize_ignored_any(de::IgnoredAny)
53 .map(|_| Reserved)
54 }
55}
56
57impl<'de> Deserialize<'de> for Empty {
58 fn deserialize<D>(deserializer: D) -> Result<Empty, D::Error>
59 where
60 D: serde::Deserializer<'de>,
61 {
62 struct EmptyVisitor;
63 impl Visitor<'_> for EmptyVisitor {
64 type Value = Empty;
65 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
66 formatter.write_str("Cannot decode empty value")
67 }
68 }
69 deserializer.deserialize_any(EmptyVisitor)
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76 use serde::Deserialize;
77
78 #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
79 pub struct TestStruct {
80 inner: Reserved,
81 }
82
83 #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
84 pub struct TestStructUpgraded {
85 inner: Option<String>,
86 }
87
88 #[test]
89 fn test_serde_with_json() {
90 let test_struct = TestStruct { inner: Reserved };
91 let serialized = serde_json::to_string(&test_struct).unwrap();
92 let deserialized = serde_json::from_str(&serialized).unwrap();
93 assert_eq!(test_struct, deserialized);
94 let _upgraded = serde_json::from_str::<TestStructUpgraded>(&serialized).unwrap();
95 }
96}