binary_option_tools_core/pocketoption/utils/
location.rs1use serde_json::Value;
2
3use crate::pocketoption::error::PocketResult;
4
5pub async fn get_user_location(ip_address: &str) -> PocketResult<(f64, f64)> {
6 let response = reqwest::get(format!("http://ip-api.com/json/{}", ip_address)).await?;
7 let json: Value = response.json().await?;
8
9 let lat = json["lat"].as_f64().unwrap();
10 let lon = json["lon"].as_f64().unwrap();
11
12 Ok((lat, lon))
13}
14
15pub fn calculate_distance(lat1: f64, lon1: f64, lat2: f64, lon2: f64) -> f64 {
16 const R: f64 = 6371.0; let dlat = (lat2 - lat1).to_radians();
20 let dlon = (lon2 - lon1).to_radians();
21
22 let lat1 = lat1.to_radians();
23 let lat2 = lat2.to_radians();
24
25 let a = dlat.sin().powi(2) + lat1.cos() * lat2.cos() * dlon.sin().powi(2);
26 let c = 2.0 * a.sqrt().asin();
27
28 R * c
29}
30
31pub async fn get_public_ip() -> PocketResult<String> {
32 let response = reqwest::get("https://api.ipify.org?format=json").await?;
33 let json: serde_json::Value = response.json().await?;
34 Ok(json["ip"].as_str().unwrap().to_string())
35}