use crate::error::Error;
use crate::servers as impl_;
use crate::types::{ClientLocation, Server};
use reqwest::Client;
pub struct ServerDiscovery {
pub servers: Vec<Server>,
pub client_location: Option<ClientLocation>,
}
pub async fn fetch(client: &Client) -> Result<ServerDiscovery, Error> {
let (servers, client_location) = impl_::fetch(client).await?;
Ok(ServerDiscovery {
servers,
client_location,
})
}
pub async fn fetch_client_location(client: &Client) -> Result<ClientLocation, Error> {
impl_::fetch_client_location(client).await
}
pub fn select_best_server(servers: &[Server]) -> Result<Server, Error> {
impl_::select_best_server(servers)
}
pub async fn ping_test(
client: &Client,
server: &Server,
) -> Result<(f64, f64, f64, Vec<f64>), Error> {
impl_::ping_test(client, server).await
}
pub fn calculate_distance(lat1: f64, lon1: f64, lat2: f64, lon2: f64) -> f64 {
impl_::calculate_distance(lat1, lon1, lat2, lon2)
}
pub async fn measure_latency_under_load(
client: Client,
url: String,
samples: std::sync::Arc<std::sync::Mutex<Vec<f64>>>,
stop_signal: std::sync::Arc<std::sync::atomic::AtomicBool>,
) {
impl_::measure_latency_under_load(client, url, samples, stop_signal).await
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_select_best_server_empty() {
let result = select_best_server(&[]);
assert!(result.is_err());
}
#[test]
fn test_calculate_distance_nyc_to_la() {
let dist = calculate_distance(40.7128, -74.0060, 34.0522, -118.2437);
assert!((dist - 3944.0).abs() < 200.0);
}
#[test]
fn test_calculate_distance_same_location() {
let dist = calculate_distance(40.7128, -74.0060, 40.7128, -74.0060);
assert!(dist < 1.0); }
}