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)] #[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 assert_eq!(
93 json["$formatVersion"].as_str().unwrap(),
94 "0",
95 "Version tag should be '0'"
96 );
97
98 assert!(json["frozen"].as_bool().unwrap());
100
101 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 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}