Skip to main content

eero_api/api/
networks.rs

1use crate::client::EeroClient;
2use crate::error::Result;
3use crate::types::network::{
4    GuestNetwork, GuestNetworkUpdate, Network, NetworkUpdate, SpeedTest,
5};
6
7impl EeroClient {
8    /// Get network details by network ID.
9    #[tracing::instrument(skip(self))]
10    pub async fn get_network(&self, network_id: u64) -> Result<Network> {
11        let url = self.url(&format!("/networks/{network_id}"));
12        self.get(&url).await
13    }
14
15    /// Get network details by resource URL.
16    #[tracing::instrument(skip(self))]
17    pub async fn get_network_by_url(&self, url: &str) -> Result<Network> {
18        let url = self.resource_url(url);
19        self.get(&url).await
20    }
21
22    /// Update network settings.
23    #[tracing::instrument(skip(self, update))]
24    pub async fn update_network(
25        &self,
26        network_id: u64,
27        update: &NetworkUpdate,
28    ) -> Result<Network> {
29        let url = self.url(&format!("/networks/{network_id}"));
30        self.put(&url, update).await
31    }
32
33    /// Reboot the entire network.
34    #[tracing::instrument(skip(self))]
35    pub async fn reboot_network(&self, network_id: u64) -> Result<serde_json::Value> {
36        let url = self.url(&format!("/networks/{network_id}/reboot"));
37        self.post_empty(&url).await
38    }
39
40    /// Run a speed test on the network.
41    ///
42    /// Returns `serde_json::Value` because the API may return 202 Accepted
43    /// with no data body.
44    #[tracing::instrument(skip(self))]
45    pub async fn run_speed_test(&self, network_id: u64) -> Result<serde_json::Value> {
46        let url = self.url(&format!("/networks/{network_id}/speedtest"));
47        let headers = self.session_headers().await?;
48        let resp = self
49            .http
50            .post(&url)
51            .headers(headers)
52            .send()
53            .await?;
54        let text = resp.text().await?;
55        let parsed: crate::types::envelope::ApiResponse<serde_json::Value> =
56            serde_json::from_str(&text)?;
57        let code = parsed.meta.code;
58        if (200..300).contains(&code) {
59            Ok(parsed.data.unwrap_or(serde_json::Value::Null))
60        } else {
61            Err(crate::error::Error::Api {
62                code,
63                message: parsed.meta.error.unwrap_or_else(|| "unknown error".into()),
64            })
65        }
66    }
67
68    /// Get the latest speed test result.
69    #[tracing::instrument(skip(self))]
70    pub async fn get_speed_test(&self, network_id: u64) -> Result<Vec<SpeedTest>> {
71        let url = self.url(&format!("/networks/{network_id}/speedtest"));
72        self.get(&url).await
73    }
74
75    /// Get guest network settings.
76    #[tracing::instrument(skip(self))]
77    pub async fn get_guest_network(&self, network_id: u64) -> Result<GuestNetwork> {
78        let url = self.url(&format!("/networks/{network_id}/guestnetwork"));
79        self.get(&url).await
80    }
81
82    /// Update guest network settings.
83    #[tracing::instrument(skip(self, update))]
84    pub async fn update_guest_network(
85        &self,
86        network_id: u64,
87        update: &GuestNetworkUpdate,
88    ) -> Result<GuestNetwork> {
89        let url = self.url(&format!("/networks/{network_id}/guestnetwork"));
90        self.put(&url, update).await
91    }
92}