From 512bd71e96e149c40d856b7ad7600d612c234a92 Mon Sep 17 00:00:00 2001 From: raphael-goetz Date: Wed, 5 Nov 2025 20:12:55 +0100 Subject: [PATCH 1/7] ref: renamed definition into search --- crates/cli/src/command/mod.rs | 2 +- crates/cli/src/command/{definition.rs => search.rs} | 0 crates/cli/src/main.rs | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename crates/cli/src/command/{definition.rs => search.rs} (100%) diff --git a/crates/cli/src/command/mod.rs b/crates/cli/src/command/mod.rs index 351e876..d65a3f7 100644 --- a/crates/cli/src/command/mod.rs +++ b/crates/cli/src/command/mod.rs @@ -1,4 +1,4 @@ -pub mod definition; +pub mod search; pub mod download; pub mod feature; pub mod report; diff --git a/crates/cli/src/command/definition.rs b/crates/cli/src/command/search.rs similarity index 100% rename from crates/cli/src/command/definition.rs rename to crates/cli/src/command/search.rs diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index dafe930..298b6bf 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -36,7 +36,7 @@ enum Commands { path: Option, }, /// Look up a specific definition. - Definition { + Search { /// Required name of the definition. #[arg(short, long)] name: String, @@ -65,7 +65,7 @@ async fn main() { match cli.command { Commands::Report { path } => command::report::report_errors(path), Commands::Feature { name, path } => command::feature::search_feature(name, path), - Commands::Definition { name, path } => command::definition::search_definition(name, path), + Commands::Search { name, path } => command::search::search_definition(name, path), Commands::Download { tag, features } => { command::download::handle_download(tag, features).await } From 96d0d523e713954562c8aebaf8c2cd8258da83b0 Mon Sep 17 00:00:00 2001 From: raphael-goetz Date: Wed, 5 Nov 2025 20:53:06 +0100 Subject: [PATCH 2/7] dependencies: added log and tonic --- Cargo.lock | 2 ++ crates/cli/Cargo.toml | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 828eab0..2f2c136 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -300,6 +300,7 @@ dependencies = [ "clap", "colored", "futures", + "log", "notify", "prost", "reqwest", @@ -307,6 +308,7 @@ dependencies = [ "serde_json", "tabled", "tokio", + "tonic", "tucana", "zip", ] diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 2673c3e..1af2ce3 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -21,4 +21,6 @@ tokio = { workspace = true, features = ["rt", "rt-multi-thread", "macros"] } futures = { workspace = true } zip = { workspace = true } bytes = { workspace = true } -prost = { workspace = true } \ No newline at end of file +prost = { workspace = true } +tonic = "0.14.2" +log = "0.4.28" \ No newline at end of file From aae74da81af0a81c333850f232819188e86da2eb Mon Sep 17 00:00:00 2001 From: raphael-goetz Date: Wed, 5 Nov 2025 20:53:27 +0100 Subject: [PATCH 3/7] feat: added push cli command --- crates/cli/src/command/mod.rs | 1 + crates/cli/src/main.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/crates/cli/src/command/mod.rs b/crates/cli/src/command/mod.rs index d65a3f7..ba244b0 100644 --- a/crates/cli/src/command/mod.rs +++ b/crates/cli/src/command/mod.rs @@ -3,3 +3,4 @@ pub mod download; pub mod feature; pub mod report; pub mod watch; +pub mod push; diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 298b6bf..94e44c2 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -50,6 +50,17 @@ enum Commands { #[arg(short, long)] path: Option, }, + Push { + /// Runtime Token for Sagittarius. + #[arg(short, long)] + token: String, + /// URL to Sagittarius. + #[arg(short, long)] + url: String, + /// Optional path to root directory of all definitions. + #[arg(short, long)] + path: Option, + }, Download { #[arg(short, long)] tag: Option, @@ -70,5 +81,6 @@ async fn main() { command::download::handle_download(tag, features).await } Commands::Watch { path } => command::watch::watch_for_changes(path).await, + Commands::Push { token, url, path } => command::push::push(token, url, path).await, } } From 01212a00dce74027e9651761c31a7c34e0447624 Mon Sep 17 00:00:00 2001 From: raphael-goetz Date: Wed, 5 Nov 2025 20:54:30 +0100 Subject: [PATCH 4/7] feat: wip Sagittarius definition clients --- crates/cli/src/command/push/auth.rs | 15 ++ .../src/command/push/data_type_client_impl.rs | 54 +++++++ .../src/command/push/flow_type_client_impl.rs | 54 +++++++ .../src/command/push/function_client_impl.rs | 54 +++++++ crates/cli/src/command/push/mod.rs | 137 ++++++++++++++++++ 5 files changed, 314 insertions(+) create mode 100644 crates/cli/src/command/push/auth.rs create mode 100644 crates/cli/src/command/push/data_type_client_impl.rs create mode 100644 crates/cli/src/command/push/flow_type_client_impl.rs create mode 100644 crates/cli/src/command/push/function_client_impl.rs create mode 100644 crates/cli/src/command/push/mod.rs diff --git a/crates/cli/src/command/push/auth.rs b/crates/cli/src/command/push/auth.rs new file mode 100644 index 0000000..81e7190 --- /dev/null +++ b/crates/cli/src/command/push/auth.rs @@ -0,0 +1,15 @@ +use std::str::FromStr; +use tonic::metadata::{MetadataMap, MetadataValue}; + +pub fn get_authorization_metadata(token: &str) -> MetadataMap { + let metadata_value = MetadataValue::from_str(token).unwrap_or_else(|error| { + panic!( + "An error occurred trying to convert runtime_token into metadata: {}", + error + ); + }); + + let mut map = MetadataMap::new(); + map.insert("authorization", metadata_value); + map +} \ No newline at end of file diff --git a/crates/cli/src/command/push/data_type_client_impl.rs b/crates/cli/src/command/push/data_type_client_impl.rs new file mode 100644 index 0000000..e7e390b --- /dev/null +++ b/crates/cli/src/command/push/data_type_client_impl.rs @@ -0,0 +1,54 @@ +use crate::command::push::auth::get_authorization_metadata; +use tonic::{Extensions, Request, transport::Channel}; +use tucana::sagittarius::{ + DataTypeUpdateRequest as SagittariusDataTypeUpdateRequest, + data_type_service_client::DataTypeServiceClient, +}; +use tucana::shared::DefinitionDataType; + +pub struct SagittariusDataTypeServiceClient { + client: DataTypeServiceClient, + token: String, +} + +impl SagittariusDataTypeServiceClient { + pub async fn new(sagittarius_url: String, token: String) -> Self { + let client = match DataTypeServiceClient::connect(sagittarius_url).await { + Ok(client) => { + log::info!("Successfully connected to Sagittarius DataType Endpoint!"); + client + } + Err(err) => panic!( + "Failed to connect to Sagittarius (DataType Endpoint): {:?}", + err + ), + }; + + Self { client, token } + } + + pub async fn update_data_types( + &mut self, + data_types: Vec, + ) { + let request = Request::from_parts( + get_authorization_metadata(&self.token), + Extensions::new(), + SagittariusDataTypeUpdateRequest { + data_types, + }, + ); + + match self.client.update(request).await { + Ok(response) => { + log::info!( + "Successfully transferred data types. Did Sagittarius updated them? {:?}", + &response + ); + } + Err(err) => { + log::error!("Failed to update DataTypes: {:?}", err); + } + }; + } +} diff --git a/crates/cli/src/command/push/flow_type_client_impl.rs b/crates/cli/src/command/push/flow_type_client_impl.rs new file mode 100644 index 0000000..e5400f8 --- /dev/null +++ b/crates/cli/src/command/push/flow_type_client_impl.rs @@ -0,0 +1,54 @@ +use tonic::Extensions; +use tonic::Request; +use tonic::transport::Channel; +use tucana::sagittarius::FlowTypeUpdateRequest as SagittariusFlowTypeUpdateRequest; +use tucana::sagittarius::flow_type_service_client::FlowTypeServiceClient; +use tucana::shared::FlowType; +use crate::command::push::auth::get_authorization_metadata; + +pub struct SagittariusFlowTypeServiceClient { + client: FlowTypeServiceClient, + token: String, +} + +impl SagittariusFlowTypeServiceClient { + pub async fn new(sagittarius_url: String, token: String) -> Self { + let client = match FlowTypeServiceClient::connect(sagittarius_url).await { + Ok(client) => { + log::info!("Successfully connected to Sagittarius FlowType Endpoint!"); + client + } + Err(err) => panic!( + "Failed to connect to Sagittarius (FlowType Endpoint): {:?}", + err + ), + }; + + Self { client, token } + } + + pub async fn update_flow_types( + &mut self, + flow_types: Vec, + ) { + let request = Request::from_parts( + get_authorization_metadata(&self.token), + Extensions::new(), + SagittariusFlowTypeUpdateRequest { + flow_types, + }, + ); + + match self.client.update(request).await { + Ok(response) => { + log::info!( + "Successfully transferred FlowTypes. Did Sagittarius updated them? {:?}", + &response + ); + } + Err(err) => { + log::error!("Failed to update FlowTypes: {:?}", err); + } + }; + } +} \ No newline at end of file diff --git a/crates/cli/src/command/push/function_client_impl.rs b/crates/cli/src/command/push/function_client_impl.rs new file mode 100644 index 0000000..24421fa --- /dev/null +++ b/crates/cli/src/command/push/function_client_impl.rs @@ -0,0 +1,54 @@ +use tonic::Extensions; +use tonic::Request; +use tonic::transport::Channel; +use tucana::sagittarius::RuntimeFunctionDefinitionUpdateRequest as SagittariusRuntimeFunctionUpdateRequest; +use tucana::sagittarius::runtime_function_definition_service_client::RuntimeFunctionDefinitionServiceClient; +use tucana::shared::RuntimeFunctionDefinition; +use crate::command::push::auth::get_authorization_metadata; + +pub struct SagittariusRuntimeFunctionServiceClient { + client: RuntimeFunctionDefinitionServiceClient, + token: String, +} + +impl SagittariusRuntimeFunctionServiceClient { + pub async fn new(sagittarius_url: String, token: String) -> Self { + let client = match RuntimeFunctionDefinitionServiceClient::connect(sagittarius_url).await { + Ok(client) => { + log::info!("Successfully connected to Sagittarius RuntimeFunction Endpoint!"); + client + } + Err(err) => panic!( + "Failed to connect to Sagittarius (RuntimeFunction Endpoint): {:?}", + err + ), + }; + + Self { client, token } + } + + pub async fn update_runtime_function_definitions( + &mut self, + runtime_functions: Vec, + ) { + let request = Request::from_parts( + get_authorization_metadata(&self.token), + Extensions::new(), + SagittariusRuntimeFunctionUpdateRequest { + runtime_functions, + }, + ); + + match self.client.update(request).await { + Ok(response) => { + log::info!( + "Successfully transferred RuntimeFunctions. Did Sagittarius updated them? {:?}", + &response + ); + } + Err(err) => { + log::error!("Failed to update RuntimeFunctions: {:?}", err); + } + }; + } +} \ No newline at end of file diff --git a/crates/cli/src/command/push/mod.rs b/crates/cli/src/command/push/mod.rs new file mode 100644 index 0000000..778e7ed --- /dev/null +++ b/crates/cli/src/command/push/mod.rs @@ -0,0 +1,137 @@ +use crate::analyser::core::Analyser; +use crate::command::push::data_type_client_impl::SagittariusDataTypeServiceClient; +use crate::command::push::flow_type_client_impl::SagittariusFlowTypeServiceClient; +use crate::command::push::function_client_impl::SagittariusRuntimeFunctionServiceClient; +use crate::formatter::{default, info}; +use notify::event::ModifyKind; +use notify::{EventKind, RecursiveMode, Watcher, recommended_watcher}; +use std::sync::mpsc::channel; +use std::time::{Duration, Instant}; + +mod auth; +mod data_type_client_impl; +mod flow_type_client_impl; +mod function_client_impl; + +pub async fn push(token: String, url: String, path: Option) { + 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); + } + + // Set up file watcher + let (tx, rx) = channel(); + let mut watcher = recommended_watcher(tx).unwrap(); + watcher + .watch(std::path::Path::new(&dir_path), RecursiveMode::Recursive) + .unwrap(); + + let mut last_run = Instant::now(); + + let mut data_type_client = + SagittariusDataTypeServiceClient::new(url.clone(), token.clone()).await; + let mut flow_type_client = + SagittariusFlowTypeServiceClient::new(url.clone(), token.clone()).await; + let mut function_client = SagittariusRuntimeFunctionServiceClient::new(url, token).await; + + loop { + if let Ok(Ok(event)) = rx.recv() { + match event.kind { + EventKind::Modify(modify) => { + if let ModifyKind::Data(_) = modify + && last_run.elapsed() > Duration::from_millis(500) + { + default(String::from( + "\n\n\n--------------------------------------------------------------------------\n\n", + )); + info(String::from("Change detected! Regenerating report...")); + let mut analyzer = Analyser::new(dir_path.as_str()); + + // No errors when reporter is empty! + if analyzer.reporter.is_empty() { + data_type_client + .update_data_types( + analyzer + .data_types + .iter() + .map(|d| d.definition_data_type.clone()) + .collect(), + ) + .await; + flow_type_client + .update_flow_types( + analyzer + .flow_types + .iter() + .map(|d| d.flow_type.clone()) + .collect(), + ) + .await; + function_client + .update_runtime_function_definitions( + analyzer + .functions + .iter() + .map(|d| d.function.clone()) + .collect(), + ) + .await; + } + + analyzer.report(false); + + last_run = Instant::now(); + } + } + EventKind::Remove(_) => { + if last_run.elapsed() > Duration::from_millis(500) { + default(String::from( + "\n\n\n--------------------------------------------------------------------------\n\n", + )); + info(String::from("Change detected! Regenerating report...")); + let mut analyzer = Analyser::new(dir_path.as_str()); + + // No errors when reporter is empty! + if analyzer.reporter.is_empty() { + data_type_client + .update_data_types( + analyzer + .data_types + .iter() + .map(|d| d.definition_data_type.clone()) + .collect(), + ) + .await; + flow_type_client + .update_flow_types( + analyzer + .flow_types + .iter() + .map(|d| d.flow_type.clone()) + .collect(), + ) + .await; + function_client + .update_runtime_function_definitions( + analyzer + .functions + .iter() + .map(|d| d.function.clone()) + .collect(), + ) + .await; + } + + analyzer.report(false); + last_run = Instant::now(); + } + } + _ => {} + } + } + } +} From 5aad62b08d7adb509bc1547c886c40f86064e4dd Mon Sep 17 00:00:00 2001 From: raphael-goetz Date: Wed, 5 Nov 2025 21:00:52 +0100 Subject: [PATCH 5/7] ref: cargo fmt --- crates/cli/src/command/mod.rs | 4 ++-- crates/cli/src/command/push/auth.rs | 2 +- .../cli/src/command/push/data_type_client_impl.rs | 9 ++------- .../cli/src/command/push/flow_type_client_impl.rs | 15 +++++---------- .../cli/src/command/push/function_client_impl.rs | 10 ++++------ 5 files changed, 14 insertions(+), 26 deletions(-) diff --git a/crates/cli/src/command/mod.rs b/crates/cli/src/command/mod.rs index ba244b0..76ca057 100644 --- a/crates/cli/src/command/mod.rs +++ b/crates/cli/src/command/mod.rs @@ -1,6 +1,6 @@ -pub mod search; pub mod download; pub mod feature; +pub mod push; pub mod report; +pub mod search; pub mod watch; -pub mod push; diff --git a/crates/cli/src/command/push/auth.rs b/crates/cli/src/command/push/auth.rs index 81e7190..434ed58 100644 --- a/crates/cli/src/command/push/auth.rs +++ b/crates/cli/src/command/push/auth.rs @@ -12,4 +12,4 @@ pub fn get_authorization_metadata(token: &str) -> MetadataMap { let mut map = MetadataMap::new(); map.insert("authorization", metadata_value); map -} \ No newline at end of file +} diff --git a/crates/cli/src/command/push/data_type_client_impl.rs b/crates/cli/src/command/push/data_type_client_impl.rs index e7e390b..1dc8a4a 100644 --- a/crates/cli/src/command/push/data_type_client_impl.rs +++ b/crates/cli/src/command/push/data_type_client_impl.rs @@ -27,16 +27,11 @@ impl SagittariusDataTypeServiceClient { Self { client, token } } - pub async fn update_data_types( - &mut self, - data_types: Vec, - ) { + pub async fn update_data_types(&mut self, data_types: Vec) { let request = Request::from_parts( get_authorization_metadata(&self.token), Extensions::new(), - SagittariusDataTypeUpdateRequest { - data_types, - }, + SagittariusDataTypeUpdateRequest { data_types }, ); match self.client.update(request).await { diff --git a/crates/cli/src/command/push/flow_type_client_impl.rs b/crates/cli/src/command/push/flow_type_client_impl.rs index e5400f8..84d2ae2 100644 --- a/crates/cli/src/command/push/flow_type_client_impl.rs +++ b/crates/cli/src/command/push/flow_type_client_impl.rs @@ -1,10 +1,10 @@ +use crate::command::push::auth::get_authorization_metadata; use tonic::Extensions; use tonic::Request; use tonic::transport::Channel; use tucana::sagittarius::FlowTypeUpdateRequest as SagittariusFlowTypeUpdateRequest; use tucana::sagittarius::flow_type_service_client::FlowTypeServiceClient; use tucana::shared::FlowType; -use crate::command::push::auth::get_authorization_metadata; pub struct SagittariusFlowTypeServiceClient { client: FlowTypeServiceClient, @@ -27,19 +27,14 @@ impl SagittariusFlowTypeServiceClient { Self { client, token } } - pub async fn update_flow_types( - &mut self, - flow_types: Vec, - ) { + pub async fn update_flow_types(&mut self, flow_types: Vec) { let request = Request::from_parts( get_authorization_metadata(&self.token), Extensions::new(), - SagittariusFlowTypeUpdateRequest { - flow_types, - }, + SagittariusFlowTypeUpdateRequest { flow_types }, ); - match self.client.update(request).await { + match self.client.update(request).await { Ok(response) => { log::info!( "Successfully transferred FlowTypes. Did Sagittarius updated them? {:?}", @@ -51,4 +46,4 @@ impl SagittariusFlowTypeServiceClient { } }; } -} \ No newline at end of file +} diff --git a/crates/cli/src/command/push/function_client_impl.rs b/crates/cli/src/command/push/function_client_impl.rs index 24421fa..bb29d20 100644 --- a/crates/cli/src/command/push/function_client_impl.rs +++ b/crates/cli/src/command/push/function_client_impl.rs @@ -1,10 +1,10 @@ +use crate::command::push::auth::get_authorization_metadata; use tonic::Extensions; use tonic::Request; use tonic::transport::Channel; use tucana::sagittarius::RuntimeFunctionDefinitionUpdateRequest as SagittariusRuntimeFunctionUpdateRequest; use tucana::sagittarius::runtime_function_definition_service_client::RuntimeFunctionDefinitionServiceClient; use tucana::shared::RuntimeFunctionDefinition; -use crate::command::push::auth::get_authorization_metadata; pub struct SagittariusRuntimeFunctionServiceClient { client: RuntimeFunctionDefinitionServiceClient, @@ -30,13 +30,11 @@ impl SagittariusRuntimeFunctionServiceClient { pub async fn update_runtime_function_definitions( &mut self, runtime_functions: Vec, - ) { + ) { let request = Request::from_parts( get_authorization_metadata(&self.token), Extensions::new(), - SagittariusRuntimeFunctionUpdateRequest { - runtime_functions, - }, + SagittariusRuntimeFunctionUpdateRequest { runtime_functions }, ); match self.client.update(request).await { @@ -51,4 +49,4 @@ impl SagittariusRuntimeFunctionServiceClient { } }; } -} \ No newline at end of file +} From ba516aa921d95764ac3dcda00558c4eb8c214473 Mon Sep 17 00:00:00 2001 From: raphael-goetz Date: Wed, 5 Nov 2025 21:03:39 +0100 Subject: [PATCH 6/7] ref: cargo clippy --- crates/cli/src/analyser/flow_type.rs | 10 ++++------ crates/cli/src/command/search.rs | 11 ++++------- crates/cli/src/formatter.rs | 2 +- crates/cli/src/table.rs | 2 +- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/crates/cli/src/analyser/flow_type.rs b/crates/cli/src/analyser/flow_type.rs index 1ecb51a..2aae286 100644 --- a/crates/cli/src/analyser/flow_type.rs +++ b/crates/cli/src/analyser/flow_type.rs @@ -36,8 +36,8 @@ impl Analyser { )); } - if let Some(identifier) = &flow.input_type_identifier { - if !self.data_type_identifier_exists(identifier, None) { + if let Some(identifier) = &flow.input_type_identifier + && !self.data_type_identifier_exists(identifier, None) { self.reporter.add(Diagnose::new( name.clone(), original.clone(), @@ -46,9 +46,8 @@ impl Analyser { }, )); } - } - if let Some(identifier) = &flow.return_type_identifier { - if !self.data_type_identifier_exists(identifier, None) { + if let Some(identifier) = &flow.return_type_identifier + && !self.data_type_identifier_exists(identifier, None) { self.reporter.add(Diagnose::new( name.clone(), original.clone(), @@ -57,7 +56,6 @@ impl Analyser { }, )); } - } for setting in &flow.settings { if setting.name.is_empty() { diff --git a/crates/cli/src/command/search.rs b/crates/cli/src/command/search.rs index 1b7d77b..223a1ab 100644 --- a/crates/cli/src/command/search.rs +++ b/crates/cli/src/command/search.rs @@ -35,7 +35,7 @@ fn search_and_display_definitions(search_name: &str, parser: &Parser) { let mut index = 0; for line in json.lines() { index += 1; - println!("{} {}", format!("{index}:"), line.bright_cyan()); + println!("{}: {}", index, line.bright_cyan()); } } Err(_) => println!("{}", "Error serializing FlowType".red()), @@ -57,7 +57,7 @@ fn search_and_display_definitions(search_name: &str, parser: &Parser) { let mut index = 0; for line in json.lines() { index += 1; - println!("{} {}", format!("{index}:"), line.bright_cyan()); + println!("{}: {}", index, line.bright_cyan()); } } Err(_) => println!("{}", "Error serializing DataType".red()), @@ -79,7 +79,7 @@ fn search_and_display_definitions(search_name: &str, parser: &Parser) { let mut index = 0; for line in json.lines() { index += 1; - println!("{} {}", format!("{index}:"), line.bright_cyan()); + println!("{}: {}", index, line.bright_cyan()); } } Err(_) => println!("{}", "Error serializing RuntimeFunction".red()), @@ -89,10 +89,7 @@ fn search_and_display_definitions(search_name: &str, parser: &Parser) { } if !found_any { - println!( - "{}", - format!("\n{}: {}", "error".red(), "Found no matching definition(s)") - ); + println!("\n{}: Found no matching definition(s)", "error".red(),); } else { success(format!("Found {total_matches} matching definition(s)")) } diff --git a/crates/cli/src/formatter.rs b/crates/cli/src/formatter.rs index 29d22e2..03aab8c 100644 --- a/crates/cli/src/formatter.rs +++ b/crates/cli/src/formatter.rs @@ -46,6 +46,6 @@ where Table::new(iter).with(Style::rounded()).to_string() } -fn print_path(path: &String) -> String { +fn print_path(path: &str) -> String { format!("\n --> {}", &path.underline()).blue().to_string() } diff --git a/crates/cli/src/table.rs b/crates/cli/src/table.rs index 2a1763d..09a28d9 100644 --- a/crates/cli/src/table.rs +++ b/crates/cli/src/table.rs @@ -76,7 +76,7 @@ pub fn feature_table( (flow_type_rows, data_type_rows, runtime_function_rows) } -pub fn summary_table(features: &Vec) -> Vec { +pub fn summary_table(features: &[Feature]) -> Vec { features .iter() .map(|feature| FeatureSummaryRow { From 9291b625fdf2dcee678aa86e9b7cec79478c4429 Mon Sep 17 00:00:00 2001 From: raphael-goetz Date: Wed, 5 Nov 2025 21:04:30 +0100 Subject: [PATCH 7/7] ref: cargo fmt --- crates/cli/src/analyser/flow_type.rs | 38 +++++++++++++++------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/crates/cli/src/analyser/flow_type.rs b/crates/cli/src/analyser/flow_type.rs index 2aae286..beb8feb 100644 --- a/crates/cli/src/analyser/flow_type.rs +++ b/crates/cli/src/analyser/flow_type.rs @@ -37,25 +37,27 @@ impl Analyser { } if let Some(identifier) = &flow.input_type_identifier - && !self.data_type_identifier_exists(identifier, None) { - self.reporter.add(Diagnose::new( - name.clone(), - original.clone(), - DiagnosticKind::UndefinedDataTypeIdentifier { - identifier: identifier.clone(), - }, - )); - } + && !self.data_type_identifier_exists(identifier, None) + { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::UndefinedDataTypeIdentifier { + identifier: identifier.clone(), + }, + )); + } if let Some(identifier) = &flow.return_type_identifier - && !self.data_type_identifier_exists(identifier, None) { - self.reporter.add(Diagnose::new( - name.clone(), - original.clone(), - DiagnosticKind::UndefinedDataTypeIdentifier { - identifier: identifier.clone(), - }, - )); - } + && !self.data_type_identifier_exists(identifier, None) + { + self.reporter.add(Diagnose::new( + name.clone(), + original.clone(), + DiagnosticKind::UndefinedDataTypeIdentifier { + identifier: identifier.clone(), + }, + )); + } for setting in &flow.settings { if setting.name.is_empty() {