es_fluent_cli_helpers/
cli.rs1use serde::Serialize;
4use std::collections::{HashMap, HashSet};
5
6#[derive(Serialize)]
8pub struct ExpectedKey {
9 pub key: String,
10 pub variables: Vec<String>,
11}
12
13#[derive(Serialize)]
15pub struct InventoryData {
16 pub expected_keys: Vec<ExpectedKey>,
17}
18
19pub fn write_inventory_for_crate(crate_name: &str) {
32 let crate_ident = crate_name.replace('-', "_");
33
34 let type_infos: Vec<_> = es_fluent_core::registry::get_all_ftl_type_infos()
36 .into_iter()
37 .filter(|info| {
38 info.module_path == crate_ident
39 || info.module_path.starts_with(&format!("{}::", crate_ident))
40 })
41 .collect();
42
43 let mut keys_map: HashMap<String, HashSet<String>> = HashMap::new();
45 for info in &type_infos {
46 for variant in &info.variants {
47 let key = variant.ftl_key.0.clone();
48 let vars: HashSet<String> = variant.args.iter().cloned().collect();
49 keys_map.entry(key).or_default().extend(vars);
50 }
51 }
52
53 let expected_keys: Vec<ExpectedKey> = keys_map
55 .into_iter()
56 .map(|(key, vars)| ExpectedKey {
57 key,
58 variables: vars.into_iter().collect(),
59 })
60 .collect();
61
62 let data = InventoryData { expected_keys };
63
64 let json = serde_json::to_string(&data).expect("Failed to serialize inventory data");
66
67 let metadata_dir = std::path::Path::new("metadata").join(crate_name);
68 std::fs::create_dir_all(&metadata_dir).expect("Failed to create metadata directory");
69
70 std::fs::write(metadata_dir.join("inventory.json"), json)
71 .expect("Failed to write inventory file");
72}