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::>(); 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"); }