use anyhow::{Context, Result};
use std::fmt::Write as FmtWrite;
use std::fs;
use std::path::Path;
fn to_f64_lit(s: &str) -> String {
if s.contains('.') || s.contains('e') || s.contains('E') {
s.to_string()
} else {
format!("{s}.0")
}
}
pub(crate) fn run_regen(raw_dir: &Path, out_dir: &Path) -> Result<()> {
let csv_path = raw_dir.join("pluto_tables.csv");
println!("cargo:rerun-if-changed={}", csv_path.display());
let csv =
fs::read_to_string(&csv_path).with_context(|| format!("reading {}", csv_path.display()))?;
struct Row {
j: String,
s: String,
p: String,
long_a: String,
long_b: String,
lat_a: String,
lat_b: String,
rad_a: String,
rad_b: String,
}
let mut rows: Vec<Row> = Vec::new();
for (i, line) in csv.lines().enumerate() {
if i == 0 {
continue; }
let line = line.trim();
if line.is_empty() {
continue;
}
let cols: Vec<&str> = line.split(',').collect();
anyhow::ensure!(cols.len() == 10, "expected 10 columns at line {}", i + 1);
rows.push(Row {
j: to_f64_lit(cols[1]),
s: to_f64_lit(cols[2]),
p: to_f64_lit(cols[3]),
long_a: to_f64_lit(cols[4]),
long_b: to_f64_lit(cols[5]),
lat_a: to_f64_lit(cols[6]),
lat_b: to_f64_lit(cols[7]),
rad_a: to_f64_lit(cols[8]),
rad_b: to_f64_lit(cols[9]),
});
}
let mut out = String::new();
writeln!(
out,
"// AUTOGENERATED by siderust-archive build.rs — DO NOT EDIT BY HAND"
)?;
writeln!(out, "// Source: src/pluto/raw/pluto_tables.csv")?;
writeln!(out)?;
writeln!(out, "use crate::pluto::*;")?;
writeln!(out)?;
writeln!(out, "#[rustfmt::skip]")?;
writeln!(out, "pub static PLUTO_ARGUMENTS: &[PlutoArgument] = &[")?;
for row in &rows {
writeln!(
out,
" PlutoArgument {{ j: {}, s: {}, p: {} }},",
row.j, row.s, row.p
)?;
}
writeln!(out, "];")?;
writeln!(out)?;
writeln!(out, "#[rustfmt::skip]")?;
writeln!(out, "pub static PLUTO_LONGITUDE_TERMS: &[PlutoTerm] = &[")?;
for row in &rows {
writeln!(
out,
" PlutoTerm {{ a: {}, b: {} }},",
row.long_a, row.long_b
)?;
}
writeln!(out, "];")?;
writeln!(out)?;
writeln!(out, "#[rustfmt::skip]")?;
writeln!(out, "pub static PLUTO_LATITUDE_TERMS: &[PlutoTerm] = &[")?;
for row in &rows {
writeln!(
out,
" PlutoTerm {{ a: {}, b: {} }},",
row.lat_a, row.lat_b
)?;
}
writeln!(out, "];")?;
writeln!(out)?;
writeln!(out, "#[rustfmt::skip]")?;
writeln!(out, "pub static PLUTO_RADIUS_TERMS: &[PlutoTerm] = &[")?;
for row in &rows {
writeln!(
out,
" PlutoTerm {{ a: {}, b: {} }},",
row.rad_a, row.rad_b
)?;
}
writeln!(out, "];")?;
let out_path = out_dir.join("pluto_data.rs");
fs::write(&out_path, &out).with_context(|| format!("writing {}", out_path.display()))?;
Ok(())
}