netspeed_cli/domain/
server.rs1use crate::error::Error;
6use crate::servers as impl_;
7use crate::types::{ClientLocation, Server};
8use reqwest::Client;
9
10pub struct ServerDiscovery {
14 pub servers: Vec<Server>,
16 pub client_location: Option<ClientLocation>,
18}
19
20pub async fn fetch(client: &Client) -> Result<ServerDiscovery, Error> {
26 let (servers, client_location) = impl_::fetch(client).await?;
27 Ok(ServerDiscovery {
28 servers,
29 client_location,
30 })
31}
32
33pub async fn fetch_client_location(client: &Client) -> Result<ClientLocation, Error> {
39 impl_::fetch_client_location(client).await
40}
41
42pub fn select_best_server(servers: &[Server]) -> Result<Server, Error> {
50 impl_::select_best_server(servers)
51}
52
53pub async fn ping_test(
61 client: &Client,
62 server: &Server,
63) -> Result<(f64, f64, f64, Vec<f64>), Error> {
64 impl_::ping_test(client, server).await
65}
66
67pub fn calculate_distance(lat1: f64, lon1: f64, lat2: f64, lon2: f64) -> f64 {
77 impl_::calculate_distance(lat1, lon1, lat2, lon2)
78}
79
80pub async fn measure_latency_under_load(
85 client: Client,
86 url: String,
87 samples: std::sync::Arc<std::sync::Mutex<Vec<f64>>>,
88 stop_signal: std::sync::Arc<std::sync::atomic::AtomicBool>,
89) {
90 impl_::measure_latency_under_load(client, url, samples, stop_signal).await
91}
92
93#[cfg(test)]
94mod tests {
95 use super::*;
96
97 #[test]
98 fn test_select_best_server_empty() {
99 let result = select_best_server(&[]);
100 assert!(result.is_err());
101 }
102
103 #[test]
104 fn test_calculate_distance_nyc_to_la() {
105 let dist = calculate_distance(40.7128, -74.0060, 34.0522, -118.2437);
106 assert!((dist - 3944.0).abs() < 200.0);
107 }
108
109 #[test]
110 fn test_calculate_distance_same_location() {
111 let dist = calculate_distance(40.7128, -74.0060, 40.7128, -74.0060);
112 assert!(dist < 1.0); }
114}