use std::env;
use std::fs;
use std::path::PathBuf;
use std::process::exit;
fn main() {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR no está definida");
let content_dir = PathBuf::from(&manifest_dir).join("content");
if !content_dir.is_dir() {
eprintln!(
"error: el directorio 'content/' no existe en {}.\n\
El crate siempre lleva sus temas: abortando la compilación.",
content_dir.display()
);
exit(1);
}
println!("cargo:rerun-if-changed=content");
let mut ficheros: Vec<String> = Vec::new();
for entrada in fs::read_dir(&content_dir).expect("no se puede leer el directorio 'content'") {
let entrada = entrada.expect("error al iterar el directorio 'content'");
let path = entrada.path();
if !path.is_file() {
continue;
}
if path.extension().and_then(|ext| ext.to_str()) != Some("html") {
continue;
}
let Some(stem) = path.file_stem().and_then(|stem| stem.to_str()) else {
continue;
};
if stem.is_empty() {
continue;
}
ficheros.push(stem.to_string());
}
if ficheros.is_empty() {
eprintln!(
"error: el directorio 'content/' no contiene ningún fichero .html.\n\
El crate siempre lleva sus temas: abortando la compilación."
);
exit(1);
}
ficheros.sort();
let mut codigo = String::new();
codigo.push_str("// Generado automáticamente por build.rs. NO EDITAR A MANO.\n");
codigo.push_str(&format!(
"pub static EMBEBIDOS: [(&str, &str); {}] = [\n",
ficheros.len()
));
for nombre in &ficheros {
codigo.push_str(&format!(
" ({:?}, include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), {:?}))),\n",
nombre,
format!("/content/{}.html", nombre)
));
}
codigo.push_str("];\n");
let out_dir = env::var("OUT_DIR").expect("OUT_DIR no está definida");
let destino = PathBuf::from(out_dir).join("temas_embebidos.rs");
fs::write(&destino, codigo).expect("no se puede escribir el fichero generado");
}