siderust-archive 0.1.1

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 EGM2008 geopotential coefficient table.
//!
//! Reads `raw/egm2008_n2_4.csv` and emits `gravity_data.rs` into `OUT_DIR`
//! with the `EGM2008_COEFFS` 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("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; // skip header
        }
        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(())
}