Skip to content

Commit c02d688

Browse files
committed
feat: added diagnostics for flow type
1 parent a24fe90 commit c02d688

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed

cli/src/analyser/diagnostics.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ pub struct Diagnose {
8585
pub enum DiagnosticKind {
8686
DeserializationError { description: String },
8787
DuplicateDataTypeIdentifier { identifier: String },
88+
DuplicateFlowTypeIdentifier { identifier: String },
8889
UndefinedDataTypeIdentifier { identifier: String },
8990
NullField { field_name: String },
9091
ForbiddenVariant,
@@ -99,6 +100,7 @@ impl DiagnosticKind {
99100
match self {
100101
DeserializationError { .. }
101102
| DuplicateDataTypeIdentifier { .. }
103+
| DuplicateFlowTypeIdentifier { .. }
102104
| UndefinedDataTypeIdentifier { .. }
103105
| NullField { .. }
104106
| ForbiddenVariant { .. }
@@ -134,6 +136,8 @@ impl Diagnose {
134136
error(format!("A JSON paring error occurred: `{}`", description), &path),
135137
DuplicateDataTypeIdentifier { identifier } =>
136138
error(format!("The data_type `{}` is already defined resulting in a duplicate!", identifier), &path),
139+
DuplicateFlowTypeIdentifier { identifier } =>
140+
error(format!("The flow_type `{}` is already defined resulting in a duplicate!", identifier), &path),
137141
UndefinedDataTypeIdentifier { identifier } =>
138142
error(format!("`{}` uses an undefined data_type_identifier: `{}`!", self.definition_name, identifier), &path),
139143
NullField { field_name } =>

cli/src/analyser/mod.rs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use tucana::shared::definition_data_type_rule::Config;
66
use code0_definition_reader::parser::Parser;
77
use code0_definition_reader::reader::{MetaType, ParsableDefinition, Reader};
88
use crate::analyser::diagnostics::{Diagnose, DiagnosticKind, Reporter};
9-
use crate::analyser::diagnostics::DiagnosticKind::{DuplicateDataTypeIdentifier, NullField, UndefinedDataTypeIdentifier, UndefinedGenericKey, UndefinedTranslation, UnusedGenericKey};
9+
use crate::analyser::diagnostics::DiagnosticKind::{DuplicateDataTypeIdentifier, DuplicateFlowTypeIdentifier, NullField, UndefinedDataTypeIdentifier, UndefinedGenericKey, UndefinedTranslation, UnusedGenericKey};
1010

1111
#[derive(Clone)]
1212
pub struct AnalysableDataType {
@@ -15,6 +15,7 @@ pub struct AnalysableDataType {
1515
pub id: i16
1616
}
1717

18+
#[derive(Clone)]
1819
pub struct AnalysableFlowType {
1920
pub original_definition: ParsableDefinition,
2021
pub flow_type: FlowType,
@@ -329,6 +330,76 @@ impl Analyser {
329330
}
330331
}
331332

333+
pub fn analyse_flow_type(&mut self, analysable_flow_type: AnalysableFlowType) {
334+
let flow= analysable_flow_type.flow_type.clone();
335+
let original_definition = analysable_flow_type.original_definition;
336+
let name = flow.identifier;
337+
338+
// Check if at least one Translation is present
339+
if flow.name.is_empty() {
340+
self.reporter.add_report(Diagnose::new(
341+
name.clone(),
342+
original_definition.clone(),
343+
UndefinedTranslation { translation_field: String::from("name") }
344+
));
345+
}
346+
347+
if flow.description.is_empty() {
348+
self.reporter.add_report(Diagnose::new(
349+
name.clone(),
350+
original_definition.clone(),
351+
UndefinedTranslation { translation_field: String::from("description") }
352+
));
353+
}
354+
355+
if flow.documentation.is_empty() {
356+
self.reporter.add_report(Diagnose::new(
357+
name.clone(),
358+
original_definition.clone(),
359+
UndefinedTranslation { translation_field: String::from("documentation") }
360+
));
361+
}
362+
363+
// Check if input identifier exists
364+
if let Some(identifier) = flow.input_type_identifier {
365+
if !self.data_type_identifier_exists(identifier.clone(), -1) {
366+
self.reporter.add_report(Diagnose::new(
367+
name.clone(),
368+
original_definition.clone(),
369+
UndefinedDataTypeIdentifier {identifier}
370+
));
371+
}
372+
}
373+
374+
// Check if return identifier exists
375+
if let Some(identifier) = flow.return_type_identifier {
376+
if !self.data_type_identifier_exists(identifier.clone(), -1) {
377+
self.reporter.add_report(Diagnose::new(
378+
name.clone(),
379+
original_definition.clone(),
380+
UndefinedDataTypeIdentifier {identifier}
381+
));
382+
}
383+
}
384+
385+
// Check if flow type identifier already exists
386+
for flow_type in &self.flow_types {
387+
if analysable_flow_type.id == flow_type.id {
388+
continue
389+
}
390+
391+
if flow_type.flow_type.identifier.to_lowercase() == name.clone().to_lowercase() {
392+
self.reporter.add_report(Diagnose::new(
393+
name.clone(),
394+
original_definition.clone(),
395+
DuplicateFlowTypeIdentifier { identifier: name }
396+
));
397+
break;
398+
}
399+
}
400+
401+
}
402+
332403
pub fn report(&self) {
333404
self.reporter.run_report()
334405
}

cli/src/command/report.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ pub fn report_errors(path: Option<String>) {
1818
analyser.analyse_data_type(data_type.clone());
1919
}
2020

21+
for flow_type in analyser.flow_types.clone() {
22+
analyser.analyse_flow_type(flow_type.clone());
23+
}
24+
2125
analyser.report();
2226

2327
error_table(&parser.features);

0 commit comments

Comments
 (0)