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