1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
31pub enum SessionPurity {
32 #[default]
34 Default,
35 New,
37 Self_,
39}
40
41#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
43#[repr(u32)]
44pub enum ReleaseMode {
45 #[default]
47 Normal = 0,
48 Deauthenticate = 0x00000002,
50}
51
52#[derive(Debug, Clone, Default)]
54pub struct DrcpOptions {
55 pub connection_class: Option<String>,
57 pub purity: SessionPurity,
59 pub enabled: bool,
61}
62
63impl DrcpOptions {
64 pub fn new() -> Self {
66 Self {
67 connection_class: None,
68 purity: SessionPurity::Default,
69 enabled: true,
70 }
71 }
72
73 pub fn with_connection_class(mut self, class: impl Into<String>) -> Self {
78 self.connection_class = Some(class.into());
79 self
80 }
81
82 pub fn with_purity(mut self, purity: SessionPurity) -> Self {
84 self.purity = purity;
85 self
86 }
87
88 pub fn disabled(mut self) -> Self {
90 self.enabled = false;
91 self
92 }
93
94 pub fn is_enabled(&self) -> bool {
96 self.enabled
97 }
98}
99
100#[derive(Debug, Clone, Default)]
102pub struct DrcpSession {
103 pub is_held: bool,
105 pub tag: Option<String>,
107 pub state_changed: bool,
109}
110
111impl DrcpSession {
112 pub fn new() -> Self {
114 Self::default()
115 }
116
117 pub fn set_held(&mut self, held: bool) {
119 self.is_held = held;
120 }
121
122 pub fn set_tag(&mut self, tag: Option<String>) {
124 self.tag = tag;
125 }
126
127 pub fn is_state_changed(&self) -> bool {
129 self.state_changed
130 }
131
132 pub fn mark_state_changed(&mut self) {
134 self.state_changed = true;
135 }
136
137 pub fn clear_state_changed(&mut self) {
139 self.state_changed = false;
140 }
141}
142
143#[cfg(test)]
144mod tests {
145 use super::*;
146
147 #[test]
148 fn test_drcp_options_default() {
149 let opts = DrcpOptions::new();
150 assert!(opts.enabled);
151 assert!(opts.connection_class.is_none());
152 assert_eq!(opts.purity, SessionPurity::Default);
153 }
154
155 #[test]
156 fn test_drcp_options_builder() {
157 let opts = DrcpOptions::new()
158 .with_connection_class("MyApp")
159 .with_purity(SessionPurity::New);
160
161 assert!(opts.is_enabled());
162 assert_eq!(opts.connection_class, Some("MyApp".to_string()));
163 assert_eq!(opts.purity, SessionPurity::New);
164 }
165
166 #[test]
167 fn test_drcp_options_disabled() {
168 let opts = DrcpOptions::new().disabled();
169 assert!(!opts.is_enabled());
170 }
171
172 #[test]
173 fn test_drcp_session_state() {
174 let mut session = DrcpSession::new();
175 assert!(!session.is_held);
176
177 session.set_held(true);
178 assert!(session.is_held);
179
180 session.set_tag(Some("tag1".to_string()));
181 assert_eq!(session.tag, Some("tag1".to_string()));
182 }
183
184 #[test]
185 fn test_drcp_session_state_changed() {
186 let mut session = DrcpSession::new();
187 assert!(!session.is_state_changed());
188
189 session.mark_state_changed();
190 assert!(session.is_state_changed());
191
192 session.clear_state_changed();
193 assert!(!session.is_state_changed());
194 }
195
196 #[test]
197 fn test_session_purity_values() {
198 assert_eq!(SessionPurity::Default, SessionPurity::default());
199 }
200
201 #[test]
202 fn test_release_mode_values() {
203 assert_eq!(ReleaseMode::Normal as u32, 0);
204 assert_eq!(ReleaseMode::Deauthenticate as u32, 0x00000002);
205 }
206}