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("nrlmsise_table.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)> = 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() == 2, "expected 2 columns at line {}", i + 1);
entries.push((cols[0].to_string(), cols[1].to_string()));
}
let mut out = String::new();
writeln!(
out,
"// AUTOGENERATED by siderust-archive build.rs — DO NOT EDIT BY HAND"
)?;
writeln!(out, "// Source: src/atmosphere/raw/nrlmsise_table.csv")?;
writeln!(out)?;
writeln!(
out,
"/// NRLMSISE-00 density profile: `(altitude, density)` pairs."
)?;
writeln!(out, "///")?;
writeln!(out, "/// F10.7 = 140, Ap = 15 (mean solar activity).")?;
writeln!(out, "#[rustfmt::skip]")?;
writeln!(
out,
"pub static NRLMSISE_TABLE: &[(::qtty::Kilometer, ::qtty::KilogramPerCubicMeter)] = &["
)?;
for (alt, den) in &entries {
writeln!(
out,
" (::qtty::Kilometer::new({alt}), ::qtty::KilogramPerCubicMeter::new({den})),"
)?;
}
writeln!(out, "];")?;
let out_path = out_dir.join("atmosphere_data.rs");
fs::write(&out_path, &out).with_context(|| format!("writing {}", out_path.display()))?;
Ok(())
}