Skip to main content

dpp/tokens/info/
mod.rs

1#[cfg(all(
2    feature = "json-conversion",
3    any(feature = "fixtures-and-mocks", feature = "serde-conversion")
4))]
5use crate::serialization::JsonConvertible;
6#[cfg(any(feature = "fixtures-and-mocks", feature = "value-conversion"))]
7use crate::serialization::ValueConvertible;
8use crate::tokens::info::v0::IdentityTokenInfoV0;
9use crate::ProtocolError;
10use bincode::{DecodeUntrusted, Encode};
11use derive_more::From;
12use platform_serialization::de::Decode;
13use platform_serialization_derive::{
14    PlatformDeserializeTrusted, PlatformDeserializeUntrusted, PlatformSerialize,
15};
16use platform_version::version::PlatformVersion;
17use platform_versioning::PlatformVersioned;
18mod methods;
19pub mod v0;
20
21#[cfg_attr(
22    all(
23        feature = "json-conversion",
24        any(feature = "fixtures-and-mocks", feature = "serde-conversion")
25    ),
26    derive(JsonConvertible)
27)]
28#[derive(
29    Debug,
30    Clone,
31    Encode,
32    Decode,
33    PlatformDeserializeTrusted,
34    PlatformDeserializeUntrusted,
35    PlatformSerialize,
36    PlatformVersioned,
37    From,
38    PartialEq,
39    DecodeUntrusted,
40)]
41#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version
42#[cfg_attr(
43    any(feature = "fixtures-and-mocks", feature = "serde-conversion"),
44    derive(serde::Serialize, serde::Deserialize),
45    serde(tag = "$formatVersion")
46)]
47#[cfg_attr(
48    any(feature = "fixtures-and-mocks", feature = "value-conversion"),
49    derive(ValueConvertible)
50)]
51pub enum IdentityTokenInfo {
52    #[cfg_attr(
53        any(feature = "fixtures-and-mocks", feature = "serde-conversion"),
54        serde(rename = "0")
55    )]
56    V0(IdentityTokenInfoV0),
57}
58
59impl IdentityTokenInfo {
60    pub fn new(frozen: bool, platform_version: &PlatformVersion) -> Result<Self, ProtocolError> {
61        match platform_version
62            .dpp
63            .token_versions
64            .identity_token_info_default_structure_version
65        {
66            0 => Ok(IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen })),
67            version => Err(ProtocolError::UnknownVersionMismatch {
68                method: "IdentityTokenInfo::new".to_string(),
69                known_versions: vec![0],
70                received: version,
71            }),
72        }
73    }
74}
75
76#[cfg(all(
77    test,
78    feature = "json-conversion",
79    any(feature = "fixtures-and-mocks", feature = "serde-conversion")
80))]
81mod tests {
82    use super::*;
83    use crate::serialization::JsonConvertible;
84
85    #[test]
86    fn identity_token_info_json_round_trip() {
87        let info = IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen: true });
88
89        let json = info.to_json().expect("to_json should succeed");
90
91        // Verify the version tag
92        assert_eq!(
93            json["$formatVersion"].as_str().unwrap(),
94            "0",
95            "Version tag should be '0'"
96        );
97
98        // Verify the boolean field
99        assert!(json["frozen"].as_bool().unwrap());
100
101        // round-trip
102        let restored = IdentityTokenInfo::from_json(json).expect("from_json should succeed");
103        assert_eq!(info, restored);
104    }
105
106    #[test]
107    fn identity_token_info_unfrozen_json_round_trip() {
108        let info = IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen: false });
109
110        let json = info.to_json().expect("to_json should succeed");
111        let restored = IdentityTokenInfo::from_json(json).expect("from_json should succeed");
112        assert_eq!(info, restored);
113    }
114}
115
116#[cfg(all(
117    test,
118    feature = "json-conversion",
119    feature = "value-conversion",
120    feature = "serde-conversion"
121))]
122mod json_convertible_tests_identitytokeninfo {
123    use super::*;
124    use crate::tokens::info::v0::IdentityTokenInfoV0;
125    use platform_value::platform_value;
126    use serde_json::json;
127
128    fn fixture() -> IdentityTokenInfo {
129        IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen: true })
130    }
131
132    #[test]
133    fn json_round_trip_with_full_wire_shape() {
134        use crate::serialization::JsonConvertible;
135        let original = fixture();
136        let json = original.to_json().expect("to_json");
137        // Internally-tagged enum with `tag = "$formatVersion"`; `IdentityTokenInfoV0`
138        // has no `rename_all`, so the inner field stays as the raw `frozen`.
139        assert_eq!(json, json!({"$formatVersion": "0", "frozen": true}));
140        let recovered = IdentityTokenInfo::from_json(json).expect("from_json");
141        assert_eq!(original, recovered);
142    }
143
144    #[test]
145    fn value_round_trip_with_full_wire_shape() {
146        use crate::serialization::ValueConvertible;
147        let original = fixture();
148        let value = original.to_object().expect("to_object");
149        assert_eq!(
150            value,
151            platform_value!({"$formatVersion": "0", "frozen": true})
152        );
153        let recovered = IdentityTokenInfo::from_object(value).expect("from_object");
154        assert_eq!(original, recovered);
155    }
156}