Skip to main content

dpp/tokens/
emergency_action.rs

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