Skip to main content

offline_protocol/telemetry/
transport_state.rs

1//! Push-based `TransportStatus` transition records.
2//!
3//! Complementary to the existing `Event::TransportSwitched`, which reports the
4//! currently-selected transport at the protocol level. This record reports the
5//! underlying connection status of a *single* transport (BLE connected,
6//! internet disconnected, ...) and fires on every observed transition rather
7//! than only on the selection switchover.
8
9use offline_protocol_transport::{TransportStatus, TransportType};
10
11/// A single `TransportStatus` transition observed by the protocol engine.
12#[derive(Debug, Clone, Copy, PartialEq, Eq)]
13pub struct TransportStateEvent {
14    /// Emission timestamp (milliseconds since Unix epoch).
15    pub timestamp_ms: i64,
16    /// The transport whose status changed.
17    pub transport: TransportType,
18    /// Previous status as last observed by the protocol engine.
19    pub previous: TransportStatus,
20    /// Current status.
21    pub current: TransportStatus,
22}
23
24impl TransportStateEvent {
25    /// Stable OTel-friendly name for this record.
26    pub const NAME: &'static str = "protocol.transport.state_changed";
27
28    /// Returns the stable telemetry name.
29    pub fn telemetry_name(&self) -> &'static str {
30        Self::NAME
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn name_is_stable() {
40        let event = TransportStateEvent {
41            timestamp_ms: 0,
42            transport: TransportType::BLE,
43            previous: TransportStatus::Disconnected,
44            current: TransportStatus::Available,
45        };
46        assert_eq!(
47            TransportStateEvent::NAME,
48            "protocol.transport.state_changed"
49        );
50        assert_eq!(event.telemetry_name(), "protocol.transport.state_changed");
51    }
52
53    #[test]
54    fn transitions_are_comparable() {
55        let a = TransportStateEvent {
56            timestamp_ms: 1,
57            transport: TransportType::BLE,
58            previous: TransportStatus::Disconnected,
59            current: TransportStatus::Available,
60        };
61        let b = a;
62        assert_eq!(a, b);
63    }
64}