Skip to main content

dpp/tokens/status/
mod.rs

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)] //versioned directly, no need to use platform_version
42pub 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        // Internally-tagged enum (`tag = "$formatVersion"`); `TokenStatusV0` has
105        // `rename_all = "camelCase"` but the only field (`paused`) is already
106        // a single-token name, so the wire key matches the source identifier.
107        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}