use rsspice::*;
use clap::Parser;
const MAXPTS: usize = 10;
#[derive(Parser)]
struct Args {
lsk: String,
ephem: String,
observer: String,
first: String,
second: String,
begin: String,
end: String,
}
fn main() -> Result<()> {
let args = Args::parse();
let mut spice = SpiceContext::new();
spice.furnsh(&args.lsk)?;
spice.furnsh(&args.ephem)?;
let et_beg = spice.str2et(&args.begin)?;
let et_end = spice.str2et(&args.end)?;
let utc_beg = spice.et2utc(et_beg, "C", 0)?;
let utc_end = spice.et2utc(et_end, "C", 0)?;
let delta = (et_end - et_beg) / (MAXPTS - 1) as f64;
let mut state = vec![];
for i in 0..MAXPTS {
let et = et_beg + delta * i as f64;
let (state1, _lt) = spice.spkezr(&args.first, et, "J2000", "LT+S", &args.observer)?;
let (state2, _lt) = spice.spkezr(&args.second, et, "J2000", "LT+S", &args.observer)?;
let pos1 = state1[0..3].try_into().unwrap();
let pos2 = state2[0..3].try_into().unwrap();
state.push((et, spice.vsep(&pos1, &pos2) * spice.dpr()));
}
println!(
"The angular separation between bodies {} and {},",
args.first, args.second
);
println!("as seen from body {}.", args.observer);
println!();
println!("From: {utc_beg}");
println!("To : {utc_end}");
println!();
println!(" UTC Time Separation");
println!("----------------------------------------------");
for (et, sep) in state {
let utc_tim = spice.et2utc(et, "C", 0)?;
println!(" {utc_tim:20} {sep:15.8} deg");
}
Ok(())
}