Skip to main content

dpp/tokens/
emergency_action.rs

1#[cfg(all(feature = "json-conversion", feature = "serde-conversion"))]
2use crate::serialization::JsonConvertible;
3#[cfg(all(feature = "value-conversion", feature = "serde-conversion"))]
4use crate::serialization::ValueConvertible;
5use crate::tokens::status::TokenStatus;
6use crate::ProtocolError;
7use bincode::{Decode, DecodeUntrusted, Encode};
8use platform_version::version::PlatformVersion;
9#[cfg(feature = "serde-conversion")]
10use serde::{Deserialize, Serialize};
11
12#[derive(
13    Debug, Clone, Copy, Default, Encode, Decode, PartialOrd, PartialEq, Eq, DecodeUntrusted,
14)]
15#[cfg_attr(
16    feature = "serde-conversion",
17    derive(Serialize, Deserialize),
18    serde(rename_all = "camelCase")
19)]
20pub enum TokenEmergencyAction {
21    #[default]
22    Pause = 0,
23    Resume = 1,
24}
25
26#[cfg(all(feature = "json-conversion", feature = "serde-conversion"))]
27impl JsonConvertible for TokenEmergencyAction {}
28
29#[cfg(all(feature = "value-conversion", feature = "serde-conversion"))]
30impl ValueConvertible for TokenEmergencyAction {}
31
32impl TokenEmergencyAction {
33    pub fn paused(&self) -> bool {
34        matches!(self, TokenEmergencyAction::Pause)
35    }
36    pub fn resulting_status(
37        &self,
38        platform_version: &PlatformVersion,
39    ) -> Result<TokenStatus, ProtocolError> {
40        match self {
41            TokenEmergencyAction::Pause => TokenStatus::new(true, platform_version),
42            TokenEmergencyAction::Resume => TokenStatus::new(false, platform_version),
43        }
44    }
45}
46
47#[cfg(all(
48    test,
49    feature = "json-conversion",
50    feature = "value-conversion",
51    feature = "serde-conversion"
52))]
53mod json_convertible_tests {
54    use super::*;
55    use platform_value::platform_value;
56    use serde_json::json;
57
58    // `TokenEmergencyAction` uses `#[serde(rename_all = "camelCase")]` over a
59    // unit-only enum, so it (de)serializes as a plain camelCase string in both
60    // JSON and platform_value.
61
62    #[test]
63    fn json_round_trip_pause() {
64        use crate::serialization::JsonConvertible;
65        let original = TokenEmergencyAction::Pause;
66        let json = original.to_json().expect("to_json");
67        assert_eq!(json, json!("pause"));
68        let recovered = TokenEmergencyAction::from_json(json).expect("from_json");
69        assert_eq!(original, recovered);
70    }
71
72    #[test]
73    fn json_round_trip_resume() {
74        use crate::serialization::JsonConvertible;
75        let original = TokenEmergencyAction::Resume;
76        let json = original.to_json().expect("to_json");
77        assert_eq!(json, json!("resume"));
78        let recovered = TokenEmergencyAction::from_json(json).expect("from_json");
79        assert_eq!(original, recovered);
80    }
81
82    #[test]
83    fn value_round_trip_pause() {
84        use crate::serialization::ValueConvertible;
85        let original = TokenEmergencyAction::Pause;
86        let value = original.to_object().expect("to_object");
87        assert_eq!(value, platform_value!("pause"));
88        let recovered = TokenEmergencyAction::from_object(value).expect("from_object");
89        assert_eq!(original, recovered);
90    }
91
92    #[test]
93    fn value_round_trip_resume() {
94        use crate::serialization::ValueConvertible;
95        let original = TokenEmergencyAction::Resume;
96        let value = original.to_object().expect("to_object");
97        assert_eq!(value, platform_value!("resume"));
98        let recovered = TokenEmergencyAction::from_object(value).expect("from_object");
99        assert_eq!(original, recovered);
100    }
101}