1#[cfg(feature = "json-conversion")]
2use crate::serialization::JsonConvertible;
3#[cfg(feature = "value-conversion")]
4use crate::serialization::ValueConvertible;
5use crate::tokens::status::v0::TokenStatusV0;
6use crate::ProtocolError;
7use bincode::{DecodeUntrusted, Encode};
8use derive_more::From;
9use platform_serialization::de::Decode;
10use platform_serialization_derive::{
11 PlatformDeserializeTrusted, PlatformDeserializeUntrusted, PlatformSerialize,
12};
13use platform_version::version::PlatformVersion;
14use platform_versioning::PlatformVersioned;
15mod methods;
16pub mod v0;
17
18#[cfg_attr(
19 all(feature = "json-conversion", feature = "serde-conversion"),
20 derive(JsonConvertible)
21)]
22#[derive(
23 Debug,
24 Clone,
25 Encode,
26 Decode,
27 PlatformDeserializeTrusted,
28 PlatformDeserializeUntrusted,
29 PlatformSerialize,
30 PlatformVersioned,
31 From,
32 PartialEq,
33 DecodeUntrusted,
34)]
35#[cfg_attr(
36 feature = "serde-conversion",
37 derive(serde::Serialize, serde::Deserialize),
38 serde(tag = "$formatVersion")
39)]
40#[cfg_attr(feature = "value-conversion", derive(ValueConvertible))]
41#[platform_serialize(unversioned)] pub enum TokenStatus {
43 #[cfg_attr(feature = "serde-conversion", serde(rename = "0"))]
44 V0(TokenStatusV0),
45}
46
47impl TokenStatus {
48 pub fn new(paused: bool, platform_version: &PlatformVersion) -> Result<Self, ProtocolError> {
49 match platform_version
50 .dpp
51 .token_versions
52 .identity_token_status_default_structure_version
53 {
54 0 => Ok(TokenStatus::V0(TokenStatusV0 { paused })),
55 version => Err(ProtocolError::UnknownVersionMismatch {
56 method: "IdentityTokenStatus::new".to_string(),
57 known_versions: vec![0],
58 received: version,
59 }),
60 }
61 }
62}
63
64#[cfg(all(test, feature = "json-conversion"))]
65mod tests {
66 use super::*;
67 use crate::serialization::JsonConvertible;
68
69 #[test]
70 fn token_status_json_round_trip() {
71 let status = TokenStatus::V0(TokenStatusV0 { paused: true });
72
73 let json = status.to_json().expect("to_json should succeed");
74
75 assert_eq!(json["$formatVersion"].as_str().unwrap(), "0");
76 assert!(json["paused"].as_bool().unwrap());
77
78 let restored = TokenStatus::from_json(json).expect("from_json should succeed");
79 assert_eq!(status, restored);
80 }
81}
82
83#[cfg(all(
84 test,
85 feature = "json-conversion",
86 feature = "value-conversion",
87 feature = "serde-conversion"
88))]
89mod json_convertible_tests_tokenstatus {
90 use super::*;
91 use crate::tokens::status::v0::TokenStatusV0;
92 use platform_value::platform_value;
93 use serde_json::json;
94
95 fn fixture() -> TokenStatus {
96 TokenStatus::V0(TokenStatusV0 { paused: true })
97 }
98
99 #[test]
100 fn json_round_trip_with_full_wire_shape() {
101 use crate::serialization::JsonConvertible;
102 let original = fixture();
103 let json = original.to_json().expect("to_json");
104 assert_eq!(json, json!({"$formatVersion": "0", "paused": true}));
108 let recovered = TokenStatus::from_json(json).expect("from_json");
109 assert_eq!(original, recovered);
110 }
111
112 #[test]
113 fn value_round_trip_with_full_wire_shape() {
114 use crate::serialization::ValueConvertible;
115 let original = fixture();
116 let value = original.to_object().expect("to_object");
117 assert_eq!(
118 value,
119 platform_value!({"$formatVersion": "0", "paused": true})
120 );
121 let recovered = TokenStatus::from_object(value).expect("from_object");
122 assert_eq!(original, recovered);
123 }
124}