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(test)]
57mod tests {
58    use super::*;
59
60    #[cfg(feature = "serde")]
61    mod serde_tests {
62        use super::*;
63
64        #[test]
65        fn reg_state_serde_uses_wire_format() {
66            for &state in GatewayRegState::ALL {
67                let json = serde_json::to_string(&state).unwrap();
68                let expected = format!("\"{}\"", state.as_str());
69                assert_eq!(json, expected, "serde must serialize as wire format");
70            }
71        }
72
73        #[test]
74        fn reg_state_serde_round_trip() {
75            for &state in GatewayRegState::ALL {
76                let json = serde_json::to_string(&state).unwrap();
77                let parsed: GatewayRegState = serde_json::from_str(&json).unwrap();
78                assert_eq!(parsed, state);
79            }
80        }
81
82        #[test]
83        fn reg_state_serde_accepts_pascal_case_alias() {
84            let cases = [
85                ("\"Noreg\"", GatewayRegState::Noreg),
86                ("\"Reged\"", GatewayRegState::Reged),
87                ("\"FailWait\"", GatewayRegState::FailWait),
88                ("\"Unreged\"", GatewayRegState::Unreged),
89            ];
90            for (json, expected) in cases {
91                let parsed: GatewayRegState = serde_json::from_str(json).unwrap();
92                assert_eq!(parsed, expected, "PascalCase alias failed for {json}");
93            }
94        }
95
96        #[test]
97        fn ping_status_serde_uses_wire_format() {
98            for &status in GatewayPingStatus::ALL {
99                let json = serde_json::to_string(&status).unwrap();
100                let expected = format!("\"{}\"", status.as_str());
101                assert_eq!(json, expected, "serde must serialize as wire format");
102            }
103        }
104
105        #[test]
106        fn ping_status_serde_round_trip() {
107            for &status in GatewayPingStatus::ALL {
108                let json = serde_json::to_string(&status).unwrap();
109                let parsed: GatewayPingStatus = serde_json::from_str(&json).unwrap();
110                assert_eq!(parsed, status);
111            }
112        }
113
114        #[test]
115        fn ping_status_serde_accepts_pascal_case_alias() {
116            let cases = [
117                ("\"Down\"", GatewayPingStatus::Down),
118                ("\"Up\"", GatewayPingStatus::Up),
119                ("\"Invalid\"", GatewayPingStatus::Invalid),
120            ];
121            for (json, expected) in cases {
122                let parsed: GatewayPingStatus = serde_json::from_str(json).unwrap();
123                assert_eq!(parsed, expected, "PascalCase alias failed for {json}");
124            }
125        }
126    }
127}