Skip to main content

candid/types/
reserved.rs

1//! Data structure for Candid type Reserved and Empty.
2
3use 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}