Skip to main content

huawei_dongle_api/models/
network.rs

1//! Network configuration models
2
3use super::enums::{NetworkModeType, NetworkType};
4use serde::{Deserialize, Serialize};
5
6/// Network mode configuration response from `/api/net/net-mode`
7#[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/// Network mode configuration request for `/api/net/net-mode`
21#[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/// Current PLMN (network operator) information from `/api/net/current-plmn`
51#[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    /// Get network mode as human-readable string
72    pub fn mode_text(&self) -> String {
73        self.network_mode.to_string()
74    }
75
76    /// Check if current mode is 4G only
77    pub fn is_4g_only(&self) -> bool {
78        matches!(self.network_mode, NetworkModeType::FourGOnly)
79    }
80
81    /// Check if current mode is auto
82    pub fn is_auto(&self) -> bool {
83        matches!(self.network_mode, NetworkModeType::Auto)
84    }
85}
86
87impl NetworkModeRequest {
88    /// Create a new network mode request
89    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    /// Create a 4G only mode request with common bands
98    pub fn lte_only() -> Self {
99        Self::new(
100            NetworkModeType::FourGOnly,
101            "3fffffff".to_string(), // All 2G/3G bands
102            "80800C5".to_string(),  // Common LTE bands
103        )
104    }
105
106    /// Create a 4G preferred with 3G fallback request
107    pub fn lte_preferred() -> Self {
108        Self::new(
109            NetworkModeType::FourGPreferredThreeGFallback,
110            "3fffffff".to_string(),
111            "80800C5".to_string(),
112        )
113    }
114
115    /// Create an auto mode request
116    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    /// Get operator name (full name if available, otherwise short name)
127    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}