dstar_gateway_core/session/client/
state.rs1pub trait ClientState: sealed::Sealed + 'static {}
5
6mod sealed {
7 pub trait Sealed {}
8}
9
10#[derive(Debug, Clone, Copy)]
12pub struct Configured;
13
14#[derive(Debug, Clone, Copy)]
16pub struct Authenticated;
17
18#[derive(Debug, Clone, Copy)]
20pub struct Connecting;
21
22#[derive(Debug, Clone, Copy)]
24pub struct Connected;
25
26#[derive(Debug, Clone, Copy)]
28pub struct Disconnecting;
29
30#[derive(Debug, Clone, Copy)]
32pub struct Closed;
33
34impl sealed::Sealed for Configured {}
35impl ClientState for Configured {}
36impl sealed::Sealed for Authenticated {}
37impl ClientState for Authenticated {}
38impl sealed::Sealed for Connecting {}
39impl ClientState for Connecting {}
40impl sealed::Sealed for Connected {}
41impl ClientState for Connected {}
42impl sealed::Sealed for Disconnecting {}
43impl ClientState for Disconnecting {}
44impl sealed::Sealed for Closed {}
45impl ClientState for Closed {}
46
47#[non_exhaustive]
49#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
50pub enum ClientStateKind {
51 Configured,
53 Authenticated,
55 Connecting,
57 Connected,
59 Disconnecting,
61 Closed,
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn states_are_distinct_zero_sized_types() {
71 assert_eq!(size_of::<Configured>(), 0);
72 assert_eq!(size_of::<Connected>(), 0);
73 assert_eq!(size_of::<Closed>(), 0);
74 }
75
76 #[test]
77 fn state_kind_variants_distinct() {
78 assert_ne!(ClientStateKind::Configured, ClientStateKind::Connected);
79 }
80}