use anyhow::{Context, Result};
use std::fmt::Write as FmtWrite;
use std::fs;
use std::path::Path;
pub(crate) fn run_regen(raw_dir: &Path, out_dir: &Path) -> Result<()> {
let csv_path = raw_dir.join("egm2008_n2_4.csv");
println!("cargo:rerun-if-changed={}", csv_path.display());
let csv =
fs::read_to_string(&csv_path).with_context(|| format!("reading {}", csv_path.display()))?;
let mut entries: Vec<(String, String, String, String)> = 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() == 4, "expected 4 columns at line {}", i + 1);
entries.push((
cols[0].to_string(),
cols[1].to_string(),
cols[2].to_string(),
cols[3].to_string(),
));
}
let mut out = String::new();
writeln!(
out,
"// AUTOGENERATED by siderust-archive build.rs — DO NOT EDIT BY HAND"
)?;
writeln!(out, "// Source: src/gravity/raw/egm2008_n2_4.csv")?;
writeln!(out)?;
writeln!(
out,
"/// EGM2008 normalized Stokes coefficients (n, m, C̄ₙₘ, S̄ₙₘ) for n = 2..=4."
)?;
writeln!(out, "#[rustfmt::skip]")?;
writeln!(
out,
"pub static EGM2008_COEFFS: &[(usize, usize, f64, f64)] = &["
)?;
for (n, m, c, s) in &entries {
writeln!(out, " ({n}, {m}, {c}, {s}),")?;
}
writeln!(out, "];")?;
let out_path = out_dir.join("gravity_data.rs");
fs::write(&out_path, &out).with_context(|| format!("writing {}", out_path.display()))?;
Ok(())
}