Simple command to check if you are within ISS visibility range
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