use serde_json::Value; pub struct Location { pub lat: f64, pub long: f64, } impl Location { pub fn build(args: &[String]) -> Result { if args.len() < 2{ println!("{}",args.len()); return Err("Not enough arguments"); } let lat: f64 = match args[0].parse::() { Ok(num) => if num >= -90.0 && num <= 90.0 { num } else { panic!("Invalid Lattitude: {num}") }, Err(e) => panic!("{:?}",e), }; let long: f64 = match args[1].parse::() { Ok(num) => if num >= -180.0 && num <= 180.0 { num } else { panic!("Invalid Longitude: {num}") }, Err(e) => panic!("{:?}",e), }; Ok(Location { lat,long }) } } pub fn get_distance(local: Location, distant: Location) -> f64 { let r:f64 = 6367.45; let delta_long = (local.long - distant.long).to_radians(); let delta_lat = (local.lat - distant.lat).to_radians(); let ang_inner = (delta_lat / 2.0).sin().powi(2) + local.lat.to_radians().cos() * distant.lat.to_radians().cos() * (delta_long / 2.0).sin().powi(2); let ang = 2.0 * ang_inner.sqrt().asin(); r*ang } pub fn get_iss_location() -> Result<[String;2],Box>{ let object: Value = match reqwest::blocking::get("http://api.open-notify.org/iss-now.json")?.json::() { Ok(object) => object["iss_position"].clone(), Err(e) => panic!("Error serializing json data: {e}"), }; let mut lat = object["latitude"].to_string(); lat.retain(|c| !r#"()":'"#.contains(c)); let mut long = object["longitude"].to_string(); long.retain(|c| !r#"()":'"#.contains(c)); Ok([lat,long]) } pub fn get_local_location() -> Result<[String;2],Box>{ let object: Value = match reqwest::blocking::get("http://ip-api.com/json/")?.json::() { Ok(object) => object.clone(), Err(e) => panic!("Error serializing json data: {e}"), }; let (lat,long) = (object["lat"].to_string(),object["lon"].to_string()); Ok([lat,long]) }