Skip to main content

freeswitch_types/sofia/
gateway.rs

1//! Gateway registration state and ping status enums.
2
3wire_enum! {
4    /// Gateway registration state from `sofia::gateway_state` events.
5    ///
6    /// The `State` header value, mapping to `reg_state_t` / `sofia_state_names[]`
7    /// in mod_sofia.
8    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9    #[cfg_attr(feature = "serde", serde(rename_all = "SCREAMING_SNAKE_CASE"))]
10    pub enum GatewayRegState {
11        #[cfg_attr(feature = "serde", serde(alias = "Unreged"))]
12        Unreged => "UNREGED",
13        #[cfg_attr(feature = "serde", serde(alias = "Trying"))]
14        Trying => "TRYING",
15        #[cfg_attr(feature = "serde", serde(alias = "Register"))]
16        Register => "REGISTER",
17        #[cfg_attr(feature = "serde", serde(alias = "Reged"))]
18        Reged => "REGED",
19        #[cfg_attr(feature = "serde", serde(alias = "Unregister"))]
20        Unregister => "UNREGISTER",
21        #[cfg_attr(feature = "serde", serde(alias = "Failed"))]
22        Failed => "FAILED",
23        #[cfg_attr(feature = "serde", serde(alias = "FailWait"))]
24        FailWait => "FAIL_WAIT",
25        #[cfg_attr(feature = "serde", serde(alias = "Expired"))]
26        Expired => "EXPIRED",
27        #[cfg_attr(feature = "serde", serde(alias = "Noreg"))]
28        Noreg => "NOREG",
29        #[cfg_attr(feature = "serde", serde(alias = "Down"))]
30        Down => "DOWN",
31        #[cfg_attr(feature = "serde", serde(alias = "Timeout"))]
32        Timeout => "TIMEOUT",
33    }
34    error ParseGatewayRegStateError("gateway reg state");
35    tests: gateway_reg_state_wire_tests;
36}
37
38wire_enum! {
39    /// Gateway ping status from `sofia::gateway_state` events.
40    ///
41    /// The `Ping-Status` header value, mapping to `sofia_gateway_status_name()`.
42    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
43    #[cfg_attr(feature = "serde", serde(rename_all = "SCREAMING_SNAKE_CASE"))]
44    pub enum GatewayPingStatus {
45        #[cfg_attr(feature = "serde", serde(alias = "Down"))]
46        Down => "DOWN",
47        #[cfg_attr(feature = "serde", serde(alias = "Up"))]
48        Up => "UP",
49        #[cfg_attr(feature = "serde", serde(alias = "Invalid"))]
50        Invalid => "INVALID",
51    }
52    error ParseGatewayPingStatusError("gateway ping status");
53    tests: gateway_ping_status_wire_tests;
54}
55
56#[cfg(all(test, feature = "serde"))]
57mod tests {
58    use super::*;
59
60    mod serde_tests {
61        use super::*;
62
63        #[test]
64        fn reg_state_serde_uses_wire_format() {
65            for &state in GatewayRegState::ALL {
66                let json = serde_json::to_string(&state).unwrap();
67                let expected = format!("\"{}\"", state.as_str());
68                assert_eq!(json, expected, "serde must serialize as wire format");
69            }
70        }
71
72        #[test]
73        fn reg_state_serde_round_trip() {
74            for &state in GatewayRegState::ALL {
75                let json = serde_json::to_string(&state).unwrap();
76                let parsed: GatewayRegState = serde_json::from_str(&json).unwrap();
77                assert_eq!(parsed, state);
78            }
79        }
80
81        #[test]
82        fn reg_state_serde_accepts_pascal_case_alias() {
83            let cases = [
84                ("\"Noreg\"", GatewayRegState::Noreg),
85                ("\"Reged\"", GatewayRegState::Reged),
86                ("\"FailWait\"", GatewayRegState::FailWait),
87                ("\"Unreged\"", GatewayRegState::Unreged),
88            ];
89            for (json, expected) in cases {
90                let parsed: GatewayRegState = serde_json::from_str(json).unwrap();
91                assert_eq!(parsed, expected, "PascalCase alias failed for {json}");
92            }
93        }
94
95        #[test]
96        fn ping_status_serde_uses_wire_format() {
97            for &status in GatewayPingStatus::ALL {
98                let json = serde_json::to_string(&status).unwrap();
99                let expected = format!("\"{}\"", status.as_str());
100                assert_eq!(json, expected, "serde must serialize as wire format");
101            }
102        }
103
104        #[test]
105        fn ping_status_serde_round_trip() {
106            for &status in GatewayPingStatus::ALL {
107                let json = serde_json::to_string(&status).unwrap();
108                let parsed: GatewayPingStatus = serde_json::from_str(&json).unwrap();
109                assert_eq!(parsed, status);
110            }
111        }
112
113        #[test]
114        fn ping_status_serde_accepts_pascal_case_alias() {
115            let cases = [
116                ("\"Down\"", GatewayPingStatus::Down),
117                ("\"Up\"", GatewayPingStatus::Up),
118                ("\"Invalid\"", GatewayPingStatus::Invalid),
119            ];
120            for (json, expected) in cases {
121                let parsed: GatewayPingStatus = serde_json::from_str(json).unwrap();
122                assert_eq!(parsed, expected, "PascalCase alias failed for {json}");
123            }
124        }
125    }
126}