diff --git a/crates/cli/src/analyser/core.rs b/crates/cli/src/analyser/core.rs index 542864f..4a1cade 100644 --- a/crates/cli/src/analyser/core.rs +++ b/crates/cli/src/analyser/core.rs @@ -39,7 +39,7 @@ impl Analyser { super::loader::load_from_path(path) } - pub fn report(&mut self, will_exit: bool) { + pub fn report(&mut self, will_exit: bool, with_warning: bool) { // Run analysis passes for dt in self.data_types.clone() { self.analyse_data_type(&dt); @@ -50,7 +50,7 @@ impl Analyser { for f in self.functions.clone() { self.analyse_runtime_function(&f); } - self.reporter.print(will_exit); + self.reporter.print(will_exit, true, with_warning); } pub fn data_type_identifier_exists(&self, identifier: &str, except_id: Option) -> bool { diff --git a/crates/cli/src/analyser/data_type.rs b/crates/cli/src/analyser/data_type.rs index 0ae8f71..df7bea9 100644 --- a/crates/cli/src/analyser/data_type.rs +++ b/crates/cli/src/analyser/data_type.rs @@ -26,6 +26,25 @@ impl Analyser { )); } + if dt.alias.is_empty() { + self.reporter.add(Diagnose::new( + dt.identifier.clone(), + adt.original_definition.clone(), + DiagnosticKind::MissingTranslation { + translation_field: "alias".into(), + }, + )); + } + + if dt.display_message.is_empty() { + self.reporter.add(Diagnose::new( + dt.identifier.clone(), + adt.original_definition.clone(), + DiagnosticKind::MissingTranslation { + translation_field: "displayMessage".into(), + }, + )); + } let mut detected: Vec = vec![]; for optional_rule in &dt.rules { if let Some(config) = &optional_rule.config { diff --git a/crates/cli/src/analyser/flow_type.rs b/crates/cli/src/analyser/flow_type.rs index beb8feb..6dd6e72 100644 --- a/crates/cli/src/analyser/flow_type.rs +++ b/crates/cli/src/analyser/flow_type.rs @@ -8,6 +8,35 @@ impl Analyser { let name = flow.identifier.clone(); let original = aft.original_definition.clone(); + if flow.display_icon.is_empty() { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::NullField { + field_name: "displayIcon".into(), + }, + )) + } + if flow.alias.is_empty() { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::MissingTranslation { + translation_field: "alias".into(), + }, + )); + } + + if flow.display_message.is_empty() { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::MissingTranslation { + translation_field: "displayMessage".into(), + }, + )); + } + if flow.name.is_empty() { self.reporter.add(Diagnose::new( name.clone(), diff --git a/crates/cli/src/analyser/function.rs b/crates/cli/src/analyser/function.rs index bd026e3..95d68dc 100644 --- a/crates/cli/src/analyser/function.rs +++ b/crates/cli/src/analyser/function.rs @@ -10,6 +10,36 @@ impl Analyser { let function = &af.function; let original = af.original_definition.clone(); + if function.display_icon.is_empty() { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::NullField { + field_name: "displayIcon".into(), + }, + )) + } + + if function.alias.is_empty() { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::MissingTranslation { + translation_field: "alias".into(), + }, + )); + } + + if function.display_message.is_empty() { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::MissingTranslation { + translation_field: "displayMessage".into(), + }, + )); + } + if function.name.is_empty() { self.reporter.add(Diagnose::new( name.clone(), diff --git a/crates/cli/src/command/feature.rs b/crates/cli/src/command/feature.rs index ea52cf6..6387725 100644 --- a/crates/cli/src/command/feature.rs +++ b/crates/cli/src/command/feature.rs @@ -14,7 +14,7 @@ pub fn search_feature(name: Option, path: Option) { }; let mut analyser = Analyser::new(dir_path.as_str()); - analyser.report(true); + analyser.report(true, true); let features = match name { None => parser.features.clone(), diff --git a/crates/cli/src/command/push/mod.rs b/crates/cli/src/command/push/mod.rs index 778e7ed..755a90d 100644 --- a/crates/cli/src/command/push/mod.rs +++ b/crates/cli/src/command/push/mod.rs @@ -20,7 +20,7 @@ pub async fn push(token: String, url: String, path: Option) { info(String::from("Press Ctrl+C to stop watching...")); { - Analyser::new(dir_path.as_str()).report(false); + Analyser::new(dir_path.as_str()).report(false, true); } // Set up file watcher @@ -82,7 +82,7 @@ pub async fn push(token: String, url: String, path: Option) { .await; } - analyzer.report(false); + analyzer.report(false, true); last_run = Instant::now(); } @@ -126,7 +126,7 @@ pub async fn push(token: String, url: String, path: Option) { .await; } - analyzer.report(false); + analyzer.report(false, true); last_run = Instant::now(); } } diff --git a/crates/cli/src/command/report.rs b/crates/cli/src/command/report.rs index 30bf537..17f64f8 100644 --- a/crates/cli/src/command/report.rs +++ b/crates/cli/src/command/report.rs @@ -14,7 +14,7 @@ pub fn report_errors(path: Option) { }; let mut analyser = Analyser::new(dir_path.as_str()); - analyser.report(true); + analyser.report(true, true); let rows = summary_table(&parser.features); success_table(rows); diff --git a/crates/cli/src/command/watch.rs b/crates/cli/src/command/watch.rs index 31960d2..3eb8f4f 100644 --- a/crates/cli/src/command/watch.rs +++ b/crates/cli/src/command/watch.rs @@ -5,14 +5,14 @@ use notify::{EventKind, RecursiveMode, Watcher, recommended_watcher}; use std::sync::mpsc::channel; use std::time::{Duration, Instant}; -pub async fn watch_for_changes(path: Option) { +pub async fn watch_for_changes(path: Option, with_warning: bool) { let dir_path = path.unwrap_or_else(|| "./definitions".to_string()); info(format!("Watching directory: {dir_path}")); info(String::from("Press Ctrl+C to stop watching...")); { - Analyser::new(dir_path.as_str()).report(false); + Analyser::new(dir_path.as_str()).report(false, with_warning); } // Set up file watcher @@ -35,7 +35,7 @@ pub async fn watch_for_changes(path: Option) { "\n\n\n--------------------------------------------------------------------------\n\n", )); info(String::from("Change detected! Regenerating report...")); - Analyser::new(dir_path.as_str()).report(false); + Analyser::new(dir_path.as_str()).report(false, with_warning); last_run = Instant::now(); } } @@ -45,7 +45,7 @@ pub async fn watch_for_changes(path: Option) { "\n\n\n--------------------------------------------------------------------------\n\n", )); info(String::from("Change detected! Regenerating report...")); - Analyser::new(dir_path.as_str()).report(false); + Analyser::new(dir_path.as_str()).report(false, with_warning); last_run = Instant::now(); } } diff --git a/crates/cli/src/diagnostics/diagnose.rs b/crates/cli/src/diagnostics/diagnose.rs index 86f83e5..fac727b 100644 --- a/crates/cli/src/diagnostics/diagnose.rs +++ b/crates/cli/src/diagnostics/diagnose.rs @@ -111,6 +111,13 @@ impl Diagnose { ), &path, ), + MissingTranslation { translation_field } => error( + format!( + "`{}` has an required empty field (`{}`) of translations!", + self.definition_name, translation_field + ), + &path, + ), } } diff --git a/crates/cli/src/diagnostics/kinds.rs b/crates/cli/src/diagnostics/kinds.rs index 6469275..7c77af3 100644 --- a/crates/cli/src/diagnostics/kinds.rs +++ b/crates/cli/src/diagnostics/kinds.rs @@ -15,6 +15,7 @@ pub enum DiagnosticKind { UnusedGenericKey { key: String }, UndefinedGenericKey { key: String }, UndefinedTranslation { translation_field: String }, + MissingTranslation { translation_field: String }, } impl DiagnosticKind { @@ -32,7 +33,8 @@ impl DiagnosticKind { | NullField { .. } | ForbiddenVariant | UnusedGenericKey { .. } - | UndefinedGenericKey { .. } => Severity::Error, + | UndefinedGenericKey { .. } + | MissingTranslation { .. } => Severity::Error, UndefinedTranslation { .. } => Severity::Warning, } } diff --git a/crates/cli/src/diagnostics/reporter.rs b/crates/cli/src/diagnostics/reporter.rs index c0f951f..bf659f2 100644 --- a/crates/cli/src/diagnostics/reporter.rs +++ b/crates/cli/src/diagnostics/reporter.rs @@ -28,13 +28,19 @@ impl Reporter { self.diagnostics.is_empty() } - pub fn print(&self, will_exit: bool) { - for d in self.errors() { - println!("{}", d.print()); + pub fn print(&self, will_exit: bool, print_errors: bool, print_warning: bool) { + if print_warning { + for d in self.warnings() { + println!("{}", d.print()); + } } - for d in self.warnings() { - println!("{}", d.print()); + + if print_errors { + for d in self.errors() { + println!("{}", d.print()); + } } + if self .diagnostics .iter() diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 94e44c2..d24b137 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -49,6 +49,9 @@ enum Commands { /// Optional path to root directory of all definitions. #[arg(short, long)] path: Option, + /// Should ignore warnings, true on default + #[arg(short, long, default_value_t = false)] + ignore_warnings: bool, }, Push { /// Runtime Token for Sagittarius. @@ -80,7 +83,10 @@ async fn main() { Commands::Download { tag, features } => { command::download::handle_download(tag, features).await } - Commands::Watch { path } => command::watch::watch_for_changes(path).await, + Commands::Watch { + path, + ignore_warnings, + } => command::watch::watch_for_changes(path, !ignore_warnings).await, Commands::Push { token, url, path } => command::push::push(token, url, path).await, } }