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