Rustelo/crates/templates/server-template/build.rs
2026-07-18 20:10:37 +01:00

84 lines
2.8 KiB
Rust

use std::collections::HashMap;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let manifest = rustelo_utils::ManifestResolver::load()?;
let root = manifest.root();
let out_dir = std::env::var("OUT_DIR")?;
let out = Path::new(&out_dir);
println!("cargo:rerun-if-changed=site/config/");
println!("cargo:rerun-if-changed=site/i18n/");
println!("cargo:rerun-if-changed=site/content/");
println!("cargo:rerun-if-changed=src/");
// ── Config constants (asset paths, server host/port, content root) ───────
rustelo_tools::build::config_constants::generate_config_constants(&out_dir)?;
// ── Route components + content types (routes/*.ncl → generated_routes.rs) ─
rustelo_tools::build::generate_shared_resources()?;
// ── Resource contributor (menus, FTL, themes → resource_contributor.rs) ───
//
// Load your site configuration here and pass the resource maps.
// Replace this block with calls to your config loader (e.g. build_config).
let (menus, footers, themes, ftl, routes) = load_site_resources(root)?;
rustelo_tools::build::generate_resource_contributor_code(
"SiteResourceContributor",
&menus,
&footers,
&themes,
&ftl,
&routes,
out,
)?;
Ok(())
}
/// Minimal resource loader — replace with your site's Nickel/TOML config loading.
fn load_site_resources(
root: &Path,
) -> Result<
(
HashMap<String, String>,
HashMap<String, String>,
HashMap<String, String>,
HashMap<String, String>,
HashMap<String, String>,
),
Box<dyn std::error::Error>,
> {
let mut ftl = HashMap::new();
// Walk site/i18n/locales/ and collect FTL files
let locales_dir = root.join("site/i18n/locales");
if locales_dir.exists() {
for entry in walkdir::WalkDir::new(&locales_dir)
.into_iter()
.filter_map(|e| e.ok())
.filter(|e| e.path().extension().is_some_and(|x| x == "ftl"))
{
let path = entry.path();
let rel = path.strip_prefix(&locales_dir).unwrap_or(path);
let key = rel
.to_string_lossy()
.replace(['/', '\\'], "_")
.trim_end_matches(".ftl")
.to_string();
let content = std::fs::read_to_string(path)?;
ftl.insert(key, content);
}
}
// Menus, footers, themes: load from site/config/ as needed.
// For the minimal template, start with empty maps — add real loading
// once you have a site config format.
Ok((
HashMap::new(), // menus
HashMap::new(), // footers
HashMap::new(), // themes
ftl,
HashMap::new(), // routes
))
}