Simple command to check if you are within ISS visibility range
at main 2.3 kB view raw
1use serde_json::Value; 2 3 4pub struct Location { 5 pub lat: f64, 6 pub long: f64, 7} 8 9impl Location { 10 pub fn build(args: &[String]) -> Result<Location, &'static str> { 11 if args.len() < 2{ 12 println!("{}",args.len()); 13 return Err("Not enough arguments"); 14 } 15 16 let lat: f64 = match args[0].parse::<f64>() { 17 Ok(num) => 18 if num >= -90.0 && num <= 90.0 { 19 num 20 } else { 21 panic!("Invalid Lattitude: {num}") 22 }, 23 Err(e) => panic!("{:?}",e), 24 }; 25 26 let long: f64 = match args[1].parse::<f64>() { 27 Ok(num) => 28 if num >= -180.0 && num <= 180.0 { 29 num 30 } else { 31 panic!("Invalid Longitude: {num}") 32 }, 33 Err(e) => panic!("{:?}",e), 34 }; 35 36 Ok(Location { lat,long }) 37 } 38} 39 40pub fn get_distance(local: Location, distant: Location) -> f64 { 41 let r:f64 = 6367.45; 42 let delta_long = (local.long - distant.long).to_radians(); 43 let delta_lat = (local.lat - distant.lat).to_radians(); 44 45 let ang_inner = (delta_lat / 2.0).sin().powi(2) 46 + local.lat.to_radians().cos() * distant.lat.to_radians().cos() * (delta_long / 2.0).sin().powi(2); 47 let ang = 2.0 * ang_inner.sqrt().asin(); 48 r*ang 49} 50 51pub fn get_iss_location() -> Result<[String;2],Box<dyn std::error::Error>>{ 52 let object: Value = match reqwest::blocking::get("http://api.open-notify.org/iss-now.json")?.json::<serde_json::Value>() { 53 Ok(object) => object["iss_position"].clone(), 54 Err(e) => panic!("Error serializing json data: {e}"), 55 }; 56 57 let mut lat = object["latitude"].to_string(); 58 lat.retain(|c| !r#"()":'"#.contains(c)); 59 let mut long = object["longitude"].to_string(); 60 long.retain(|c| !r#"()":'"#.contains(c)); 61 Ok([lat,long]) 62} 63 64 65pub fn get_local_location() -> Result<[String;2],Box<dyn std::error::Error>>{ 66 let object: Value = match reqwest::blocking::get("http://ip-api.com/json/")?.json::<serde_json::Value>() { 67 Ok(object) => object.clone(), 68 Err(e) => panic!("Error serializing json data: {e}"), 69 }; 70 71 let (lat,long) = (object["lat"].to_string(),object["lon"].to_string()); 72 Ok([lat,long]) 73} 74