siderust-archive 0.1.2

Reusable Rust bindings for the Siderust Archive: manifests, checksums, provenance, and runtime download of scientific datasets (IERS time data, kernels, planetary theories).
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (C) 2026 Vallés Puig, Ramon

//! Build-time pipeline for the NRLMSISE-00 atmosphere density table.
//!
//! Reads `raw/nrlmsise_table.csv` and emits `atmosphere_data.rs` into
//! `OUT_DIR` with the `NRLMSISE_TABLE` static.

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; // skip header
        }
        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(())
}