dstar_gateway_core/error/
protocol.rs

1//! `ProtocolError` umbrella for per-protocol structured errors.
2
3use crate::codec::dcs::error::DcsError;
4use crate::codec::dextra::error::DExtraError as DExtraCodecError;
5use crate::codec::dplus::error::DPlusError;
6
7/// Per-protocol structured errors.
8#[derive(Debug, Clone, thiserror::Error, PartialEq, Eq)]
9#[non_exhaustive]
10pub enum ProtocolError {
11    /// `DPlus` (REF) protocol error with structured cause.
12    #[error(transparent)]
13    DPlus(#[from] DPlusError),
14
15    /// `DExtra` (XRF/XLX) protocol error with structured cause.
16    #[error(transparent)]
17    DExtra(#[from] DExtraCodecError),
18
19    /// `DCS` protocol error with structured cause.
20    #[error(transparent)]
21    Dcs(#[from] DcsError),
22}
23
24#[cfg(test)]
25mod tests {
26    use super::*;
27
28    #[test]
29    fn protocol_error_dplus_display() {
30        let inner = DPlusError::StreamIdZero;
31        let err = ProtocolError::DPlus(inner);
32        assert!(err.to_string().contains("DPlus stream id is zero"));
33    }
34
35    #[test]
36    fn protocol_error_dextra_display() {
37        let inner = DExtraCodecError::StreamIdZero;
38        let err = ProtocolError::DExtra(inner);
39        assert!(err.to_string().contains("DExtra stream id is zero"));
40    }
41
42    #[test]
43    fn protocol_error_dcs_display() {
44        let inner = DcsError::StreamIdZero;
45        let err = ProtocolError::Dcs(inner);
46        assert!(err.to_string().contains("DCS stream id is zero"));
47    }
48
49    #[test]
50    fn from_dplus_error_composes_into_protocol_error() {
51        let inner = DPlusError::UnknownPacketLength { got: 42 };
52        let outer: ProtocolError = inner.into();
53        assert!(matches!(
54            outer,
55            ProtocolError::DPlus(DPlusError::UnknownPacketLength { got: 42 })
56        ));
57    }
58
59    #[test]
60    fn from_dextra_error_composes_into_protocol_error() {
61        let inner = DExtraCodecError::UnknownPacketLength { got: 42 };
62        let outer: ProtocolError = inner.into();
63        assert!(matches!(
64            outer,
65            ProtocolError::DExtra(DExtraCodecError::UnknownPacketLength { got: 42 })
66        ));
67    }
68
69    #[test]
70    fn from_dcs_error_composes_into_protocol_error() {
71        let inner = DcsError::UnknownPacketLength { got: 42 };
72        let outer: ProtocolError = inner.into();
73        assert!(matches!(
74            outer,
75            ProtocolError::Dcs(DcsError::UnknownPacketLength { got: 42 })
76        ));
77    }
78
79    #[test]
80    fn from_dplus_error_composes_into_top_level_error() {
81        let inner = DPlusError::StreamIdZero;
82        let top: crate::error::Error = ProtocolError::DPlus(inner).into();
83        assert!(matches!(
84            top,
85            crate::error::Error::Protocol(ProtocolError::DPlus(DPlusError::StreamIdZero))
86        ));
87    }
88
89    #[test]
90    fn from_dcs_error_composes_into_top_level_error() {
91        let inner = DcsError::StreamIdZero;
92        let top: crate::error::Error = ProtocolError::Dcs(inner).into();
93        assert!(matches!(
94            top,
95            crate::error::Error::Protocol(ProtocolError::Dcs(DcsError::StreamIdZero))
96        ));
97    }
98}