Skip to main content

dpp/tokens/
emergency_action.rs

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