huawei_dongle_api/models/
network.rs1use super::enums::{NetworkModeType, NetworkType};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename = "response")]
9pub struct NetworkMode {
10 #[serde(rename = "NetworkMode")]
11 pub network_mode: NetworkModeType,
12
13 #[serde(rename = "NetworkBand")]
14 pub network_band: String,
15
16 #[serde(rename = "LTEBand")]
17 pub lte_band: String,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
22#[serde(rename = "request")]
23pub struct NetworkModeRequest {
24 #[serde(rename = "NetworkMode", serialize_with = "serialize_network_mode")]
25 pub network_mode: NetworkModeType,
26
27 #[serde(rename = "NetworkBand")]
28 pub network_band: String,
29
30 #[serde(rename = "LTEBand")]
31 pub lte_band: String,
32}
33
34fn serialize_network_mode<S>(mode: &NetworkModeType, serializer: S) -> Result<S::Ok, S::Error>
35where
36 S: serde::Serializer,
37{
38 let mode_str = match mode {
39 NetworkModeType::Auto => "00",
40 NetworkModeType::TwoGOnly => "01",
41 NetworkModeType::ThreeGOnly => "02",
42 NetworkModeType::FourGOnly => "03",
43 NetworkModeType::ThreeGPreferredTwoGFallback => "0201",
44 NetworkModeType::FourGPreferredTwoGFallback => "0301",
45 NetworkModeType::FourGPreferredThreeGFallback => "0302",
46 };
47 serializer.serialize_str(mode_str)
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52#[serde(rename = "response")]
53pub struct CurrentPlmn {
54 #[serde(rename = "State")]
55 pub state: String,
56
57 #[serde(rename = "FullName")]
58 pub full_name: Option<String>,
59
60 #[serde(rename = "ShortName")]
61 pub short_name: Option<String>,
62
63 #[serde(rename = "Numeric")]
64 pub numeric: Option<String>,
65
66 #[serde(rename = "Rat")]
67 pub rat: Option<NetworkType>,
68}
69
70impl NetworkMode {
71 pub fn mode_text(&self) -> String {
73 self.network_mode.to_string()
74 }
75
76 pub fn is_4g_only(&self) -> bool {
78 matches!(self.network_mode, NetworkModeType::FourGOnly)
79 }
80
81 pub fn is_auto(&self) -> bool {
83 matches!(self.network_mode, NetworkModeType::Auto)
84 }
85}
86
87impl NetworkModeRequest {
88 pub fn new(mode: NetworkModeType, network_band: String, lte_band: String) -> Self {
90 Self {
91 network_mode: mode,
92 network_band,
93 lte_band,
94 }
95 }
96
97 pub fn lte_only() -> Self {
99 Self::new(
100 NetworkModeType::FourGOnly,
101 "3fffffff".to_string(), "80800C5".to_string(), )
104 }
105
106 pub fn lte_preferred() -> Self {
108 Self::new(
109 NetworkModeType::FourGPreferredThreeGFallback,
110 "3fffffff".to_string(),
111 "80800C5".to_string(),
112 )
113 }
114
115 pub fn auto() -> Self {
117 Self::new(
118 NetworkModeType::Auto,
119 "3fffffff".to_string(),
120 "80800C5".to_string(),
121 )
122 }
123}
124
125impl CurrentPlmn {
126 pub fn operator_name(&self) -> Option<&str> {
128 self.full_name.as_deref().or(self.short_name.as_deref())
129 }
130}
131
132#[cfg(test)]
133mod tests {
134 use super::*;
135
136 #[test]
137 fn test_network_mode_text() {
138 let mode = NetworkMode {
139 network_mode: NetworkModeType::FourGOnly,
140 network_band: "3fffffff".to_string(),
141 lte_band: "80800C5".to_string(),
142 };
143
144 assert_eq!(mode.mode_text(), "4G Only (LTE)");
145 assert!(mode.is_4g_only());
146 assert!(!mode.is_auto());
147 }
148
149 #[test]
150 fn test_request_creation() {
151 let request = NetworkModeRequest::lte_only();
152 assert_eq!(request.network_mode, NetworkModeType::FourGOnly);
153 assert_eq!(request.network_band, "3fffffff");
154 assert_eq!(request.lte_band, "80800C5");
155 }
156}