reddb-io-server 1.15.0

RedDB server-side engine: storage, runtime, replication, MCP, AI, and the gRPC/HTTP/RedWire/PG-wire dispatchers. Re-exported by the umbrella `reddb` crate.
Documentation
#![allow(clippy::unwrap_used)]

use std::env;
use std::fs;
use std::path::{Path, PathBuf};

fn main() {
    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
    let routes_dir = manifest_dir.join("src/server/routes");
    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
    let out_file = out_dir.join("route_discovery.rs");

    println!("cargo:rerun-if-changed={}", routes_dir.display());

    let mut route_files = Vec::new();
    collect_route_files(&routes_dir, &mut route_files);
    route_files.sort();

    let mut generated = String::new();
    generated.push_str("// @generated by crates/reddb-server/build.rs\n");
    generated.push_str(
        "// Files matching src/server/routes/**/*.route.rs are discovered automatically.\n\n",
    );

    for (index, path) in route_files.iter().enumerate() {
        generated.push_str(&format!(
            "#[path = {:?}]\nmod route_{index};\n",
            path.display().to_string()
        ));
    }

    generated.push_str(
        "\npub(crate) fn register_discovered_routes(registry: &mut crate::server::route_catalog::RouteRegistry) {\n",
    );
    for index in 0..route_files.len() {
        generated.push_str(&format!("    route_{index}::register(registry);\n"));
    }
    generated.push_str("}\n");

    fs::write(out_file, generated).unwrap();
}

fn collect_route_files(dir: &Path, route_files: &mut Vec<PathBuf>) {
    println!("cargo:rerun-if-changed={}", dir.display());

    let Ok(entries) = fs::read_dir(dir) else {
        return;
    };

    for entry in entries.flatten() {
        let path = entry.path();
        if path.is_dir() {
            collect_route_files(&path, route_files);
        } else if path
            .file_name()
            .and_then(|name| name.to_str())
            .is_some_and(|name| name.ends_with(".route.rs"))
        {
            println!("cargo:rerun-if-changed={}", path.display());
            route_files.push(path);
        }
    }
}