dfhack-proto-srcs 0.4.2-dev

Download and extract DFHack protobuf files from source
Documentation
use std::{
    fs::File,
    path::{Path, PathBuf},
};

fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-env-changed=DFHACK_ZIP_URL");
    println!("cargo:rerun-if-env-changed=DFHACK_DOWNLOAD");

    let regen = match std::env::var("DFHACK_DOWNLOAD") {
        Ok(val) => val == "1",
        Err(_) => false,
    };

    if !regen {
        return;
    }

    let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap());
    let mut proto_dir = PathBuf::from(std::env::var_os("CARGO_MANIFEST_DIR").unwrap());
    proto_dir.push("src");
    proto_dir.push("protos");

    if proto_dir.exists() {
        std::fs::remove_dir_all(&proto_dir).unwrap();
    }
    std::fs::create_dir_all(&proto_dir).unwrap();

    // Download the file
    let dfhack_archive_path = Path::new(&out_dir).join("dfhack.zip");
    let mut dfhack_archive = File::create(&dfhack_archive_path).unwrap();
    let dfhack_url = match std::env::var("DFHACK_ZIP_URL") {
        Ok(val) => val,
        Err(_) => "https://codeload.github.com/DFHack/dfhack/zip/refs/tags/0.47.05-r4".to_string(),
    };
    let mut dfhack_download_request = reqwest::blocking::get(dfhack_url).unwrap();
    std::io::copy(&mut dfhack_download_request, &mut dfhack_archive).unwrap();

    // Extract the protos
    let mut protos = Vec::new();
    let dfhack_archive = File::open(&dfhack_archive_path).unwrap();
    let mut dfhack_archive = zip::ZipArchive::new(dfhack_archive).unwrap();
    for i in 0..dfhack_archive.len() {
        let mut file = dfhack_archive.by_index(i).unwrap();
        let outpath = match file.enclosed_name() {
            Some(path) => path.to_owned(),
            None => continue,
        };

        if outpath.extension().unwrap_or_default() != "proto" {
            continue;
        }

        let mut dest = proto_dir.clone();
        dest.push(PathBuf::from(outpath.file_name().unwrap()));

        let mut outfile = File::create(&dest).unwrap();
        std::io::copy(&mut file, &mut outfile).unwrap();
        protos.push(dest);
    }
}