#![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);
}
}
}