Skip to main content

es_fluent_build/
lib.rs

1#![doc = include_str!("../README.md")]
2#![allow(clippy::needless_doctest_main)]
3
4use es_fluent_shared::resource::{
5    FALLBACK_CATALOG_ENV, FALLBACK_CATALOG_FILE_NAME, INVENTORY_RUNNER_ENV,
6};
7use es_fluent_toml::ResolvedI18nLayout;
8use std::path::{Path, PathBuf};
9
10mod catalog;
11
12pub use catalog::validate_sparse_catalog_inputs;
13use catalog::write_fallback_catalog;
14
15#[allow(clippy::needless_doctest_main)]
16/// Tracks configured locale assets and writes the strict fallback-message catalog.
17///
18/// Call this from your crate's `build.rs` so locale changes trigger a rebuild and
19/// derived messages can be checked against resolvable fallback-locale values.
20///
21/// # Example
22///
23/// ```no_run
24/// // build.rs
25/// fn main() {
26///     es_fluent_build::track_i18n_assets();
27/// }
28/// ```
29pub fn track_i18n_assets() {
30    let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR must be set");
31    let package_name = std::env::var("CARGO_PKG_NAME").expect("CARGO_PKG_NAME must be set");
32    let out_dir = std::env::var_os("OUT_DIR")
33        .map(PathBuf::from)
34        .expect("OUT_DIR must be set");
35    let layout = ResolvedI18nLayout::from_manifest_dir(Path::new(&manifest_dir))
36        .expect("Failed to read i18n.toml configuration");
37
38    let catalog_path = out_dir.join(FALLBACK_CATALOG_FILE_NAME);
39    println!("cargo:rerun-if-changed={}", layout.config_path.display());
40    println!("cargo:rerun-if-changed={}", layout.assets_dir.display());
41    println!("cargo:rerun-if-env-changed={INVENTORY_RUNNER_ENV}");
42    println!(
43        "cargo:rustc-env={FALLBACK_CATALOG_ENV}={}",
44        catalog_path.display()
45    );
46
47    if std::env::var_os(INVENTORY_RUNNER_ENV).is_some() {
48        std::fs::write(&catalog_path, b"")
49            .expect("Failed to initialize fallback Fluent message catalog");
50        return;
51    }
52
53    write_fallback_catalog(&layout, &package_name, &out_dir)
54        .expect("Failed to build fallback Fluent message catalog");
55}
56
57#[cfg(test)]
58mod tests;