36 lines
1.4 KiB
Rust
36 lines
1.4 KiB
Rust
use std::{env, fs, path::PathBuf};
|
|
|
|
fn main() {
|
|
println!("cargo:rerun-if-changed=lang");
|
|
|
|
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR"));
|
|
let lang_dir = manifest_dir.join("lang");
|
|
let mut files = fs::read_dir(&lang_dir)
|
|
.unwrap_or_else(|error| panic!("failed to read {}: {error}", lang_dir.display()))
|
|
.filter_map(Result::ok)
|
|
.map(|entry| entry.path())
|
|
.filter(|path| path.extension().and_then(|value| value.to_str()) == Some("json"))
|
|
.collect::<Vec<_>>();
|
|
files.sort();
|
|
|
|
if files.is_empty() {
|
|
panic!("lang directory must contain at least one .json language file");
|
|
}
|
|
|
|
let mut generated = String::from("pub const EMBEDDED_LANGUAGE_FILES: &[(&str, &str)] = &[\n");
|
|
for path in files {
|
|
let name = path
|
|
.file_name()
|
|
.and_then(|value| value.to_str())
|
|
.expect("language filename must be valid UTF-8");
|
|
println!("cargo:rerun-if-changed=lang/{name}");
|
|
generated.push_str(&format!(
|
|
" ({name:?}, include_str!(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/lang/{name}\"))),\n"
|
|
));
|
|
}
|
|
generated.push_str("];\n");
|
|
|
|
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
|
|
fs::write(out_dir.join("languages.rs"), generated).expect("failed to generate embedded languages");
|
|
}
|