Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
dfb1968
dependencies: updated tucana to 0.0.55
raphael-goetz Mar 2, 2026
a10fbe4
feat: updated data types
raphael-goetz Mar 2, 2026
df92ea2
feat: updated functions to include new type instead of dataTypeIdenti…
raphael-goetz Mar 2, 2026
3a75b88
feat: updated functions to include type instead of data type identifier
raphael-goetz Mar 2, 2026
71614f6
feat: updated object functions
raphael-goetz Mar 2, 2026
c8f38b6
drop: removed data type
raphael-goetz Mar 2, 2026
aa8d99e
fix: correct signature for OBJECT
raphael-goetz Mar 2, 2026
03296f3
drop: removed regex rule from string
raphael-goetz Mar 2, 2026
9a87b64
feat: updated text functions
raphael-goetz Mar 2, 2026
1841d19
dependencies: update to tucana 0.0.56
raphael-goetz Mar 4, 2026
a0624ff
feat: removed unneeded error types
raphael-goetz Mar 4, 2026
3ed5ee6
feat: adjusted cli to latest data type defintions
raphael-goetz Mar 4, 2026
f505d7b
drop: removed unused code
raphael-goetz Mar 4, 2026
bc87968
ref: renamed and removed some fields
raphael-goetz Mar 4, 2026
4e833b1
feat: reworked definitions
raphael-goetz Mar 4, 2026
8eb0b7c
fix: removed outdated filelds and renamed some wrong fields
raphael-goetz Mar 4, 2026
16b8d0a
fix: removed every leftover field: genericKeys
raphael-goetz Mar 4, 2026
aad47a8
feat: requested changes from copilot
raphael-goetz Mar 4, 2026
8fce220
Update crates/cli/src/diagnostics/diagnose.rs
raphael-goetz Mar 4, 2026
85588e1
fix: added back genericKeys for data types
raphael-goetz Mar 4, 2026
6d63fcf
fix: correct generics in signature
raphael-goetz Mar 5, 2026
745349b
drop: removed defaultValue field
raphael-goetz Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ edition = "2024"
[workspace.dependencies]
serde = "1.0.219"
serde_json = "1.0.140"
tucana = "0.0.54"
tucana = "0.0.56"
clap = "4.5.41"
colored = "3.0"
tabled = "0.20"
Expand Down
13 changes: 0 additions & 13 deletions crates/cli/src/analyser/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,19 +57,6 @@ impl Analyser {
self.index.has_data_type(identifier, except_id)
}

pub fn generic_key_in_target(&self, key: &str, target: &str) -> bool {
let norm_target = target.to_ascii_lowercase();
self.data_types.iter().any(|dt| {
dt.definition_data_type
.identifier
.eq_ignore_ascii_case(&norm_target)
&& dt
.definition_data_type
.generic_keys
.contains(&key.to_string())
})
}

pub fn null_field(&mut self, name: String, adt: &AnalysableDataType) {
self.reporter.add(Diagnose::new(
adt.definition_data_type.identifier.clone(),
Expand Down
161 changes: 21 additions & 140 deletions crates/cli/src/analyser/data_type.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::analyser::core::{AnalysableDataType, Analyser};
use crate::diagnostics::diagnose::Diagnose;
use crate::diagnostics::kinds::DiagnosticKind;
use tucana::shared::DataTypeIdentifier;
use tucana::shared::data_type_identifier::Type;
use tucana::shared::definition_data_type_rule::Config;

impl Analyser {
Expand All @@ -17,13 +15,16 @@ impl Analyser {
},
));
}

if dt.variant == 0 {
self.reporter.add(Diagnose::new(
dt.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::ForbiddenVariant,
));
for linked in dt.linked_data_type_identifiers.clone() {
if !self.data_type_identifier_exists(linked.as_str(), None) {
self.reporter.add(Diagnose::new(
dt.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::UndefinedDataTypeIdentifier {
identifier: linked.clone(),
},
));
}
}

if dt.alias.is_empty() {
Expand All @@ -45,89 +46,27 @@ impl Analyser {
},
));
}
let mut detected: Vec<String> = vec![];

if dt.signature == "" {
self.reporter.add(Diagnose::new(
dt.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::NullField {
field_name: "signature".into(),
},
));
}

for optional_rule in &dt.rules {
if let Some(config) = &optional_rule.config {
match config {
Config::ContainsKey(rule) => {
if let Some(dti) = &rule.data_type_identifier {
self.walk_data_type_identifier(adt, dti, &mut detected);
} else {
self.null_field("definition_data_type_contains_key_rule".into(), adt);
}
}
Config::ContainsType(rule) => {
if let Some(dti) = &rule.data_type_identifier {
self.walk_data_type_identifier(adt, dti, &mut detected);
} else {
self.null_field("definition_data_type_contains_type_rule".into(), adt);
}
}
Config::ItemOfCollection(rule) => {
if rule.items.is_empty() {
self.null_field(
"definition_data_type_item_of_collection_rule".into(),
adt,
);
}
}
Config::NumberRange(_) | Config::Regex(_) => {}
Config::InputTypes(rule) => {
if rule.input_types.is_empty() {
self.null_field("definition_data_type_input_types_rule".into(), adt);
}
for input in &rule.input_types {
if let Some(dti) = &input.data_type_identifier {
self.walk_data_type_identifier(adt, dti, &mut detected);
} else {
self.reporter.add(Diagnose::new(
dt.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::UndefinedDataTypeIdentifier {
identifier: dt.identifier.clone(),
},
));
}
}
}
Config::ReturnType(rule) => {
if let Some(dti) = &rule.data_type_identifier {
self.walk_data_type_identifier(adt, dti, &mut detected);
} else {
self.null_field("definition_data_type_return_type_rule".into(), adt);
}
}
Config::ParentType(rule) => {
if let Some(dti) = &rule.parent_type {
self.walk_data_type_identifier(adt, dti, &mut detected);
} else {
self.null_field("definition_data_type_parent_type_rule".into(), adt);
}
}
}
} else {
self.null_field("rule".into(), adt);
}
}

for key in dt.generic_keys.iter().filter(|k| !detected.contains(k)) {
self.reporter.add(Diagnose::new(
dt.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::UnusedGenericKey { key: key.clone() },
));
}
for key in detected
.into_iter()
.filter(|k| !dt.generic_keys.contains(k))
{
self.reporter.add(Diagnose::new(
dt.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::UndefinedGenericKey { key },
));
}

if dt.name.is_empty() {
self.reporter.add(Diagnose::new(
dt.identifier.clone(),
Expand All @@ -138,62 +77,4 @@ impl Analyser {
));
}
}

fn walk_data_type_identifier(
&mut self,
adt: &AnalysableDataType,
dti: &DataTypeIdentifier,
acc: &mut Vec<String>,
) {
if let Some(t) = &dti.r#type {
match t {
Type::DataTypeIdentifier(identifier) => {
if !self.data_type_identifier_exists(identifier, Some(adt.id)) {
self.reporter.add(Diagnose::new(
adt.definition_data_type.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::UndefinedDataTypeIdentifier {
identifier: identifier.clone(),
},
));
}
}
Type::GenericType(generic) => {
if !self
.data_type_identifier_exists(&generic.data_type_identifier, Some(adt.id))
{
self.reporter.add(Diagnose::new(
adt.definition_data_type.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::UndefinedDataTypeIdentifier {
identifier: generic.data_type_identifier.clone(),
},
));
}
if generic.generic_mappers.is_empty() {
self.reporter.add(Diagnose::new(
adt.definition_data_type.identifier.clone(),
adt.original_definition.clone(),
DiagnosticKind::EmptyGenericMapper,
));
}
for mapper in &generic.generic_mappers {
if adt
.definition_data_type
.generic_keys
.contains(&mapper.target)
{
acc.push(mapper.target.clone());
}
for source in &mapper.source {
self.walk_data_type_identifier(adt, source, acc);
}
}
}
Type::GenericKey(key) => acc.push(key.clone()),
}
} else {
self.null_field("data_type".into(), adt);
}
}
}
13 changes: 7 additions & 6 deletions crates/cli/src/analyser/flow_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,24 +66,25 @@ impl Analyser {
}

if let Some(identifier) = &flow.input_type_identifier
&& !self.data_type_identifier_exists(identifier, None)
&& identifier == ""
{
self.reporter.add(Diagnose::new(
name.clone(),
original.clone(),
DiagnosticKind::UndefinedDataTypeIdentifier {
identifier: identifier.clone(),
DiagnosticKind::NullField {
field_name: "input_type_identifier".into(),
},
));
}

if let Some(identifier) = &flow.return_type_identifier
&& !self.data_type_identifier_exists(identifier, None)
&& identifier == ""
{
self.reporter.add(Diagnose::new(
name.clone(),
original.clone(),
DiagnosticKind::UndefinedDataTypeIdentifier {
identifier: identifier.clone(),
DiagnosticKind::NullField {
field_name: "return_type_identifier".into(),
},
));
}
Expand Down
Loading