local_fmt_macros_internal/def_local_fmt/internal/
mod.rs1use arg::{LangMessage, Message, MessageValue};
2
3use crate::utils::hierarchy::Hierarchy;
4
5use super::arg::{ArgFileType, ArgPath, MessageField};
6
7mod arg;
8pub mod file;
9
10pub fn generate(file_type: ArgFileType, path: ArgPath, message: &MessageField) -> Vec<LangMessage> {
11 let lang_messages = file::parse(file_type, path);
12
13 for lang_message in &lang_messages {
14 check_lang_message(
15 &lang_message.lang,
16 &lang_message.messages,
17 &mut Hierarchy::new(),
18 message,
19 );
20 }
21
22 lang_messages
23}
24
25fn check_lang_message(
26 lang: &str,
27 messages: &Vec<Message>,
28 hierarchy: &mut Hierarchy<String>,
29 field: &MessageField,
30) {
31 match &field.fields {
32 None => {
33 for message in messages {
34 if let MessageValue::Nested(_) = &message.value {
35 panic!(
36 "Expected a simple message, but got a nested message in language {}: {}",
37 lang, message.key
38 );
39 }
40 }
41 }
42 Some(fields) => {
43 for (ty, field) in fields {
44 let message = messages.iter().find(|m| *ty == m.key).unwrap_or_else(|| {
45 panic!(
46 "Expected a nest message with key {}, but got nothing in language {}",
47 ty, lang
48 )
49 });
50
51 match &message.value {
52 MessageValue::Nested(nested) => {
53 hierarchy.process(ty.to_string(), |hierarchy| {
54 check_lang_message(lang, nested, hierarchy, field);
55 });
56 }
57 _ => {
58 panic!(
59 "Expected a nested message, but got a simple message in language {}: {}",
60 lang, message.key
61 );
62 }
63 }
64 }
65 }
66 }
67}