From 7215d496f3c9f99fe9d00985f61f7121d2cf5e09 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Fri, 7 Nov 2025 13:45:37 -0700 Subject: [PATCH 1/5] Add ts_xml_define procedural macro. This macro allows expanding a component full interface from its xml files into rust structs. --- Cargo.lock | 45 +++++++-- Cargo.toml | 1 + base_topic_derive/src/lib.rs | 141 ++++++++++++++-------------- salobj/Cargo.toml | 1 + ts_xml_define/Cargo.lock | 62 +++++++++++++ ts_xml_define/Cargo.toml | 17 ++++ ts_xml_define/src/lib.rs | 149 ++++++++++++++++++++++++++++++ ts_xml_define/tests/test_macro.rs | 100 ++++++++++++++++++++ 8 files changed, 437 insertions(+), 79 deletions(-) create mode 100644 ts_xml_define/Cargo.lock create mode 100644 ts_xml_define/Cargo.toml create mode 100644 ts_xml_define/src/lib.rs create mode 100644 ts_xml_define/tests/test_macro.rs diff --git a/Cargo.lock b/Cargo.lock index 049176f..1924157 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -315,6 +315,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "convert_case" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -611,7 +620,7 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" name = "handle_command" version = "0.1.0" dependencies = [ - "convert_case", + "convert_case 0.6.0", "proc-macro2", "quote", "syn", @@ -1300,9 +1309,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1315,9 +1324,9 @@ checksum = "5a651516ddc9168ebd67b24afd085a718be02f8858fe406591b013d101ce2f40" [[package]] name = "quote" -version = "1.0.37" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -1441,6 +1450,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "roxmltree" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb" +dependencies = [ + "memchr", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -1505,6 +1523,7 @@ dependencies = [ "serde_json", "simple_logger", "tokio", + "ts_xml_define", "whoami", ] @@ -1767,9 +1786,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -2020,6 +2039,18 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "ts_xml_define" +version = "0.1.0" +dependencies = [ + "convert_case 0.11.0", + "proc-macro2", + "quote", + "roxmltree", + "serde", + "syn", +] + [[package]] name = "typenum" version = "1.17.0" diff --git a/Cargo.toml b/Cargo.toml index 8bfca5a..36192d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,5 +3,6 @@ members = [ "salobj", "base_topic_derive", "handle_command", + "ts_xml_define", ] resolver = "2" diff --git a/base_topic_derive/src/lib.rs b/base_topic_derive/src/lib.rs index d4ce82d..9fbf011 100644 --- a/base_topic_derive/src/lib.rs +++ b/base_topic_derive/src/lib.rs @@ -85,82 +85,79 @@ pub fn add_sal_topic_fields(_args: TokenStream, input: TokenStream) -> TokenStre let mut ast = parse_macro_input!(input as DeriveInput); match &mut ast.data { syn::Data::Struct(ref mut struct_data) => { - match &mut struct_data.fields { - syn::Fields::Named(fields) => { - fields.named.push( - syn::Field::parse_named - .parse2(quote! { private_origin: i32 }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { private_identity: String }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { - #[serde(rename = "private_seqNum")] - private_seq_num: i32 - }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { - #[serde(rename = "private_rcvStamp")] - private_rcv_stamp: f64 - }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { - #[serde(rename = "private_sndStamp")] - private_snd_stamp: f64 - }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { - #[serde(rename = "salIndex", default = "get_default_sal_index")] - sal_index: i32 - }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { - #[serde(rename = "private_efdStamp")] - private_efd_stamp: f64 - }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { - #[serde(rename = "private_kafkaStamp")] - private_kafka_stamp: f64 - }) - .unwrap(), - ); - fields.named.push( - syn::Field::parse_named - .parse2(quote! { - #[serde(rename = "private_revCode")] - private_rev_code: String - }) - .unwrap(), - ); - } - _ => (), + if let syn::Fields::Named(fields) = &mut struct_data.fields { + fields.named.push( + syn::Field::parse_named + .parse2(quote! { private_origin: i32 }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { private_identity: String }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { + #[serde(rename = "private_seqNum")] + private_seq_num: i32 + }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { + #[serde(rename = "private_rcvStamp")] + private_rcv_stamp: f64 + }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { + #[serde(rename = "private_sndStamp")] + private_snd_stamp: f64 + }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { + #[serde(rename = "salIndex", default = "get_default_sal_index")] + sal_index: i32 + }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { + #[serde(rename = "private_efdStamp")] + private_efd_stamp: f64 + }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { + #[serde(rename = "private_kafkaStamp")] + private_kafka_stamp: f64 + }) + .unwrap(), + ); + fields.named.push( + syn::Field::parse_named + .parse2(quote! { + #[serde(rename = "private_revCode")] + private_rev_code: String + }) + .unwrap(), + ); } - return quote! { + quote! { #ast } - .into(); + .into() } _ => panic!("`add_sal_topic_fields` has to be used with structs "), } diff --git a/salobj/Cargo.toml b/salobj/Cargo.toml index 7a59c38..3fc9dc2 100644 --- a/salobj/Cargo.toml +++ b/salobj/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" apache-avro = "0.19.0" base_topic_derive = {path = "../base_topic_derive"} handle_command = {path = "../handle_command"} +ts_xml_define = {path = "../ts_xml_define"} chrono = "0.4" clap = { version = "4.1.6", features = ["derive"] } num-traits = "0.2.19" diff --git a/ts_xml_define/Cargo.lock b/ts_xml_define/Cargo.lock new file mode 100644 index 0000000..3fa14d3 --- /dev/null +++ b/ts_xml_define/Cargo.lock @@ -0,0 +1,62 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "roxmltree" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb" +dependencies = [ + "memchr", +] + +[[package]] +name = "syn" +version = "2.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "ts_xml_define" +version = "0.1.0" +dependencies = [ + "quote", + "roxmltree", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" diff --git a/ts_xml_define/Cargo.toml b/ts_xml_define/Cargo.toml new file mode 100644 index 0000000..16b3b4b --- /dev/null +++ b/ts_xml_define/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "ts_xml_define" +version = "0.1.0" +edition = "2021" + +[lib] +proc-macro = true + +[dependencies] +quote = "1.0.41" +syn = "2.0.108" +roxmltree = "0.21.1" +convert_case = "0.11.0" +proc-macro2 = "1.0.106" + +[dev-dependencies] +serde = { version = "1.0.228", features = ["derive"] } diff --git a/ts_xml_define/src/lib.rs b/ts_xml_define/src/lib.rs new file mode 100644 index 0000000..cb56d31 --- /dev/null +++ b/ts_xml_define/src/lib.rs @@ -0,0 +1,149 @@ +use convert_case::{Case, Casing}; +use proc_macro::TokenStream; +use proc_macro2::TokenStream as TokenStream2; +use quote::{format_ident, quote}; +use std::env; +use std::fs; + +#[proc_macro] +pub fn ts_xml_define(input: TokenStream) -> TokenStream { + // Parse input identifier (e.g., Test) + let name = syn::parse_macro_input!(input as syn::Ident); + + // Get environment variable + let dir = env::var("TS_XML_DIR").expect("TS_XML_DIR environment variable must be set"); + + // Build XML path + let telemetry_path = format!("{}/{}/{}_Telemetry.xml", dir, name, name); + let event_path = format!("{}/{}/{}_Events.xml", dir, name, name); + let command_path = format!("{}/{}/{}_Commands.xml", dir, name, name); + let generics_path = format!("{}/SALGenerics.xml", dir); + + // Collect all structs + let structs: Vec = expand_topics(&telemetry_path, None) + .into_iter() + .chain( + expand_topics(&event_path, None).into_iter().chain( + expand_topics(&command_path, None) + .into_iter() + .chain(expand_topics(&generics_path, Some(&format!("{name}")))), + ), + ) + .collect(); + + let expanded = quote! { + #(#structs)* + }; + + expanded.into() +} + +fn expand_topics(topic_file_path: &str, replace_generic_with: Option<&str>) -> Vec { + let xml_content = fs::read_to_string(topic_file_path) + .unwrap_or_else(|_| panic!("Failed to read XML file: {}", topic_file_path)); + + // Parse XML + let doc = roxmltree::Document::parse(&xml_content) + .unwrap_or_else(|e| panic!("Error parsing XML file {}: {}", topic_file_path, e)); + + // Find all nodes + let topics: Vec<_> = doc + .descendants() + .filter(|n| { + n.has_tag_name("SALTelemetry") + || n.has_tag_name("SALEvent") + || n.has_tag_name("SALCommand") + }) + .collect(); + + // Collect all structs + let mut structs = Vec::new(); + + for topic_data in topics { + let topic = topic_data + .descendants() + .find(|n| n.has_tag_name("EFDB_Topic")) + .and_then(|n| n.text()) + .map(|n| { + if let Some(component_name) = replace_generic_with { + n.to_string().replace("SALGeneric", component_name) + } else { + n.to_string() + } + }) + .unwrap_or_else(|| panic!("Missing EFDB_Topic in {}", topic_file_path)) + .to_case(Case::Pascal); + + let topic_ident = format_ident!("{}", topic); + + let mut fields = Vec::new(); + + for item in topic_data.children().filter(|n| n.has_tag_name("item")) { + let name = item + .descendants() + .find(|n| n.has_tag_name("EFDB_Name")) + .and_then(|n| n.text()) + .unwrap() + .to_string(); + + let idl_type = item + .descendants() + .find(|n| n.has_tag_name("IDL_Type")) + .and_then(|n| n.text()) + .unwrap() + .trim() + .to_string(); + + let rust_type = match idl_type.as_str() { + "boolean" => quote! { bool }, + "byte" => quote! { i8 }, + "short" => quote! { i16 }, + "int" => quote! { i32 }, + "long" => quote! { i64 }, + "long long" => quote! { i64 }, + "unsigned short" => quote! { u16 }, + "unsigned int" => quote! { u32 }, + "unsigned long" => quote! { u64 }, + "float" => quote! { f32 }, + "double" => quote! { f64 }, + "string" => quote! { String }, + _ => panic!("Unknown IDL_Type: {}", idl_type), + }; + + let count = item + .descendants() + .find(|n| n.has_tag_name("Count")) + .and_then(|n| n.text()) + .and_then(|t| t.parse::().ok()) + .unwrap_or(1); + + let fname = format_ident!("{}", name); + + let field_type = if count > 1 { + quote! { [#rust_type; #count] } + } else { + quote! { #rust_type } + }; + + fields.push(quote! { pub #fname: #field_type }); + } + + fields.push(quote! { private_origin: i32 }); + fields.push(quote! { private_identity: String }); + fields.push(quote! { private_seqNum: i32 }); + fields.push(quote! { private_rcvStamp: f64 }); + fields.push(quote! { private_sndStamp: f64 }); + fields.push(quote! { pub salIndex: i32 }); + fields.push(quote! { private_efdStamp: f64 }); + fields.push(quote! { private_kafkaStamp: f64}); + fields.push(quote! { private_revCode: String }); + + structs.push(quote! { + #[derive(Debug, Clone, Default, Deserialize)] + pub struct #topic_ident { + #(#fields),* + } + }); + } + structs +} diff --git a/ts_xml_define/tests/test_macro.rs b/ts_xml_define/tests/test_macro.rs new file mode 100644 index 0000000..0eb42a4 --- /dev/null +++ b/ts_xml_define/tests/test_macro.rs @@ -0,0 +1,100 @@ +use serde::Deserialize; +use ts_xml_define::ts_xml_define; + +ts_xml_define!(Test); + +#[test] +fn test_telemetry_scalars() { + let scalars = TestScalars::default(); + assert_eq!(scalars.int0, 0); +} + +#[test] +fn test_telemetry_arrays() { + let arrays = TestArrays::default(); + assert_eq!(arrays.int0, [0, 0, 0, 0, 0]); +} + +#[test] +fn test_logevent_arrays() { + let arrays = TestLogeventArrays::default(); + assert_eq!(arrays.int0, [0, 0, 0, 0, 0]); +} + +#[test] +fn test_command_set_scalars() { + let set_scalars = TestCommandSetScalars::default(); + assert_eq!(set_scalars.int0, 0); +} + +#[test] +fn test_command_set_arrays() { + let arrays = TestCommandSetArrays::default(); + assert_eq!(arrays.int0, [0, 0, 0, 0, 0]); +} + +#[test] +fn test_command_fault() { + let fault = TestCommandFault::default(); + assert_eq!(fault.private_sndStamp, 0.); +} + +#[test] +fn test_generic_command_start() { + let topic = TestCommandStart::default(); + assert_eq!(topic.configurationOverride, ""); +} + +#[test] +fn test_generic_command_enable() { + let topic = TestCommandEnable::default(); + assert_eq!(topic.private_sndStamp, 0.); +} + +#[test] +fn test_generic_command_disable() { + let topic = TestCommandDisable::default(); + assert_eq!(topic.private_sndStamp, 0.); +} + +#[test] +fn test_generic_command_standby() { + let topic = TestCommandStandby::default(); + assert_eq!(topic.private_sndStamp, 0.); +} + +#[test] +fn test_generic_command_enter_control() { + let topic = TestCommandEnterControl::default(); + assert_eq!(topic.private_sndStamp, 0.); +} + +#[test] +fn test_generic_command_exit_control() { + let topic = TestCommandExitControl::default(); + assert_eq!(topic.private_sndStamp, 0.); +} + +#[test] +fn test_generic_command_abort() { + let topic = TestCommandAbort::default(); + assert_eq!(topic.private_sndStamp, 0.); +} + +#[test] +fn test_generic_command_set_log_level() { + let topic = TestCommandSetLogLevel::default(); + assert_eq!(topic.level, 0); +} + +#[test] +fn test_generic_logevent_summary_state() { + let topic = TestLogeventSummaryState::default(); + assert_eq!(topic.summaryState, 0); +} + +#[test] +fn test_generic_logevent_heartbeat() { + let topic = TestLogeventHeartbeat::default(); + assert!(!topic.heartbeat); +} From 126447e0c1c645084d199964854816da5f426c06 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Sun, 15 Feb 2026 12:00:44 -0300 Subject: [PATCH 2/5] Add ``AGENTS.md`` file to be used as a guide to agentic coding tools. --- AGENTS.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..df3d962 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,68 @@ +# Developer Agent Guidelines - rs_salobj + +This repository contains the Rust implementation of the Object-Oriented Service Abstraction Layer (SAL), used for control software at the Vera C. Rubin Observatory. + +## 🛠 Build, Lint, and Test Commands + +The project is a Rust workspace. Commands should generally be run from the root. + +### Build & Check +- **Build all:** `cargo build --workspace` +- **Check (fast):** `cargo check --workspace` +- **Clippy (lint):** `cargo clippy --workspace -- -D warnings` +- **Format:** `cargo fmt --all` + +### Running Tests +- **Run all tests:** `cargo test --workspace` +- **Run single crate tests:** `cargo test -p salobj` +- **Run a single test module:** `cargo test -p salobj --lib domain::tests` +- **Run a specific test:** `cargo test -p salobj --lib domain::tests::get_default_identity -- --nocapture` +- **Run documentation tests:** `cargo test --doc` + +## 🦀 Code Style & Conventions + +### 1. General Principles +- Follow standard Rust idioms and naming conventions (`PascalCase` for types/enums, `snake_case` for functions/variables). +- Use `rustfmt` for all formatting. +- Prefer `async/await` using the `tokio` runtime. + +### 2. Imports +- Group imports in the following order: + 1. Standard library (`std::...`) + 2. External crates + 3. Internal crate modules (`crate::...`) +- Use `use crate::...` for internal module imports within the same crate. + +### 3. Error Handling +- Use the custom error system defined in `salobj/src/error/errors.rs`. +- All fallible functions should return `SalObjResult`, which is an alias for `Result`. +- Implement `From` for `SalObjError` in `errors.rs` to support the `?` operator. +- Avoid `unwrap()` and `expect()` in library code; prefer returning errors. + +### 4. Async & Concurrency +- Use `tokio` for tasks, timers, and synchronization. +- Use `tokio::sync::mpsc` for multi-producer, single-consumer communication. +- Use `tokio::sync::watch` for state changes that need to be observed by multiple tasks. +- Background tasks should be spawned using `tokio::task::spawn`. + +### 5. SAL Specific Patterns +- **Topics:** Use the `#[add_sal_topic_fields]` attribute and `#[derive(BaseSALTopic)]` on structs representing SAL topics. +- **Commands:** Use the `handle_command!` macro in `TestCSC` or similar controllers to implement the command processing loop. +- **CSCs:** Components should implement the `BaseCSC` trait and follow the state machine transitions (`Standby`, `Disabled`, `Enabled`, `Fault`, `Offline`). +- **Domain:** Use the `Domain` struct to manage Kafka client identities and configurations. + +### 6. Documentation +- Use `//!` for module-level documentation. +- Use `///` for public struct, enum, and function documentation. +- Document the *why* and any side effects or background tasks spawned by a function. + +## 📁 Project Structure + +- `salobj/`: Main library implementation. +- `base_topic_derive/`: Procedural macros for deriving `BaseSALTopic`. +- `handle_command/`: Procedural macro for command handling logic. +- `ts_xml_define/`: Procedural macro for generating SAL telemetry Rust structs from XML schema definitions (independent crate). + +## ⚠️ Safety & Best Practices +- **Kafka:** Ensure `LSST_KAFKA_BROKER_ADDR` and `LSST_SCHEMA_REGISTRY_URL` are handled via the `Domain` utility. +- **Cleanup:** Always ensure background tasks (like heartbeats or telemetry loops) are properly aborted or joined when a component is dropped or transitions to `Offline`. From d69ca9b3b817e79444e5cf3a05f37cc30a87dce3 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 16 Feb 2026 21:04:46 -0300 Subject: [PATCH 3/5] Fix clippy warnings. --- salobj/src/component_info.rs | 7 +++---- salobj/src/csc/test_csc/topics/scalars.rs | 8 ++++---- salobj/src/domain.rs | 7 ++----- salobj/src/generics/configurations_available.rs | 6 +++--- salobj/src/generics/disable.rs | 6 +++--- salobj/src/generics/enable.rs | 6 +++--- salobj/src/generics/enter_control.rs | 6 +++--- salobj/src/generics/error_code.rs | 6 +++--- salobj/src/generics/exit_control.rs | 6 +++--- salobj/src/generics/heartbeat.rs | 8 ++++---- salobj/src/generics/large_file_object_available.rs | 6 +++--- salobj/src/generics/log_level.rs | 6 +++--- salobj/src/generics/log_message.rs | 6 +++--- salobj/src/generics/set_log_level.rs | 6 +++--- salobj/src/generics/simulation_mode.rs | 6 +++--- salobj/src/generics/software_version.rs | 6 +++--- salobj/src/generics/standby.rs | 6 +++--- salobj/src/generics/start.rs | 6 +++--- salobj/src/generics/status_code.rs | 6 +++--- salobj/src/generics/summary_state.rs | 6 +++--- salobj/src/sal_info.rs | 14 +++++++------- salobj/src/topics/write_topic.rs | 2 +- salobj/src/utils/schema_utils.rs | 4 ++-- 23 files changed, 71 insertions(+), 75 deletions(-) diff --git a/salobj/src/component_info.rs b/salobj/src/component_info.rs index 4503883..7f99cb7 100644 --- a/salobj/src/component_info.rs +++ b/salobj/src/component_info.rs @@ -167,12 +167,11 @@ mod tests { #[test] fn create_test_component_info() { let component_info = ComponentInfo::new("Test", "unit_test").unwrap(); - let component_info_commands: Vec<&String> = - component_info.commands.keys().into_iter().collect(); + let component_info_commands: Vec<&String> = component_info.commands.keys().collect(); assert_eq!(component_info.name, "Test"); assert_eq!(component_info.topic_subname, "unit_test"); - assert_eq!(component_info.is_indexed(), true); + assert!(component_info.is_indexed()); assert_eq!(component_info.ack_cmd.get_topic_name(), "ackcmd"); assert_eq!(component_info.ack_cmd.get_sal_name(), "Test_ackcmd"); assert_eq!(component_info.get_topic_subname(), "unit_test"); @@ -202,7 +201,7 @@ mod tests { .collect(); let heartbeat_schema = avro_schema.get("logevent_heartbeat").unwrap(); - let heartbeat_record = Record::new(&heartbeat_schema).unwrap(); + let heartbeat_record = Record::new(heartbeat_schema).unwrap(); let record_fields: HashSet = heartbeat_record .fields diff --git a/salobj/src/csc/test_csc/topics/scalars.rs b/salobj/src/csc/test_csc/topics/scalars.rs index eb4497e..f4dc4db 100644 --- a/salobj/src/csc/test_csc/topics/scalars.rs +++ b/salobj/src/csc/test_csc/topics/scalars.rs @@ -47,7 +47,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_scalars").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("salIndex", Value::Int(3)); topic_record.put("private_sndStamp", Value::Double(1700679476.9876108)); @@ -96,14 +96,14 @@ mod tests { // topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new(CompressionLevel::NoCompression)), ); writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); @@ -116,7 +116,7 @@ mod tests { "tribeiro@lynx.local".to_owned() ); assert_eq!(topic.get_private_origin(), 13784); - assert_eq!(topic.boolean0, false); + assert!(!topic.boolean0); assert_eq!(topic.byte0, 0); assert_eq!(topic.short0, 0); assert_eq!(topic.int0, 10); diff --git a/salobj/src/domain.rs b/salobj/src/domain.rs index aefdbc8..b9bec14 100644 --- a/salobj/src/domain.rs +++ b/salobj/src/domain.rs @@ -179,11 +179,8 @@ mod tests { let default_value = DEFAULT_LSST_KAFKA_CLIENT_ADDR.to_owned(); let value = Domain::get_client_hosts()[0].to_owned(); - if current_lsst_kafka_client_addr.is_ok() { - env::set_var( - "LSST_KAFKA_CLIENT_ADDR", - current_lsst_kafka_client_addr.unwrap(), - ); + if let Ok(current_lsst_kafka_client_addr) = current_lsst_kafka_client_addr { + env::set_var("LSST_KAFKA_CLIENT_ADDR", current_lsst_kafka_client_addr); } assert_eq!(value, default_value) } diff --git a/salobj/src/generics/configurations_available.rs b/salobj/src/generics/configurations_available.rs index ab7d5d3..358b151 100644 --- a/salobj/src/generics/configurations_available.rs +++ b/salobj/src/generics/configurations_available.rs @@ -52,7 +52,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_configurationsAvailable").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put( "configurations", @@ -75,7 +75,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -84,7 +84,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/disable.rs b/salobj/src/generics/disable.rs index c3ad788..0d6268e 100644 --- a/salobj/src/generics/disable.rs +++ b/salobj/src/generics/disable.rs @@ -31,7 +31,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("command_disable").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("private_sndStamp", Value::Double(1.234)); topic_record.put("private_origin", Value::Int(123)); @@ -44,7 +44,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -53,7 +53,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/enable.rs b/salobj/src/generics/enable.rs index 4329c53..8a307e3 100644 --- a/salobj/src/generics/enable.rs +++ b/salobj/src/generics/enable.rs @@ -31,7 +31,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("command_enable").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("private_sndStamp", Value::Double(1.234)); topic_record.put("private_origin", Value::Int(123)); @@ -44,7 +44,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -53,7 +53,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/enter_control.rs b/salobj/src/generics/enter_control.rs index 07e0920..5a37236 100644 --- a/salobj/src/generics/enter_control.rs +++ b/salobj/src/generics/enter_control.rs @@ -31,7 +31,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("command_enterControl").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("private_sndStamp", Value::Double(1.234)); topic_record.put("private_origin", Value::Int(123)); @@ -44,7 +44,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -53,7 +53,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/error_code.rs b/salobj/src/generics/error_code.rs index e9c6817..28326e9 100644 --- a/salobj/src/generics/error_code.rs +++ b/salobj/src/generics/error_code.rs @@ -49,7 +49,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_errorCode").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("errorCode", Value::Int(0)); topic_record.put("errorReport", Value::String("errorReport".to_string())); @@ -66,7 +66,7 @@ mod tests { topic_record.put("salIndex", Value::Int(1)); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -75,7 +75,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/exit_control.rs b/salobj/src/generics/exit_control.rs index 8ed828a..54b97d3 100644 --- a/salobj/src/generics/exit_control.rs +++ b/salobj/src/generics/exit_control.rs @@ -31,7 +31,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("command_exitControl").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("private_sndStamp", Value::Double(1.234)); topic_record.put("private_origin", Value::Int(123)); @@ -44,7 +44,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -53,7 +53,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/heartbeat.rs b/salobj/src/generics/heartbeat.rs index 5770635..d6535ae 100644 --- a/salobj/src/generics/heartbeat.rs +++ b/salobj/src/generics/heartbeat.rs @@ -39,7 +39,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_heartbeat").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("heartbeat", Value::Boolean(false)); topic_record.put("private_sndStamp", Value::Double(1.234)); @@ -53,7 +53,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -62,12 +62,12 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); - assert_eq!(topic.get_heartbeat(), false); + assert!(!topic.get_heartbeat()); assert_eq!(topic.get_private_origin(), 123); assert_eq!(topic.get_private_identity(), "unit@test".to_string()); assert_eq!(topic.get_private_seq_num(), 321); diff --git a/salobj/src/generics/large_file_object_available.rs b/salobj/src/generics/large_file_object_available.rs index 0e7ab5c..5c98ac0 100644 --- a/salobj/src/generics/large_file_object_available.rs +++ b/salobj/src/generics/large_file_object_available.rs @@ -68,7 +68,7 @@ mod tests { let topic_schema = avro_schema .get("logevent_largeFileObjectAvailable") .unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("url", Value::String("url".to_owned())); topic_record.put("generator", Value::String("generator".to_owned())); @@ -89,7 +89,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -98,7 +98,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/log_level.rs b/salobj/src/generics/log_level.rs index 0810270..fa0d3bd 100644 --- a/salobj/src/generics/log_level.rs +++ b/salobj/src/generics/log_level.rs @@ -43,7 +43,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_logLevel").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("level", Value::Int(0)); topic_record.put("subsystem", Value::String("subsystem".to_string())); @@ -58,7 +58,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -67,7 +67,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/log_message.rs b/salobj/src/generics/log_message.rs index 86d62cc..7957233 100644 --- a/salobj/src/generics/log_message.rs +++ b/salobj/src/generics/log_message.rs @@ -74,7 +74,7 @@ mod tests { .collect(); let schema = avro_schema.get("logevent_logMessage").unwrap(); - let mut record = Record::new(&schema).unwrap(); + let mut record = Record::new(schema).unwrap(); record.put("name", Value::String("Test".to_owned())); record.put("level", Value::Int(10)); @@ -97,7 +97,7 @@ mod tests { record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &schema, + schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -106,7 +106,7 @@ mod tests { writer.append(record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&schema, &input[..]).unwrap(); + let reader = Reader::with_schema(schema, &input[..]).unwrap(); for record in reader { let log_message = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/set_log_level.rs b/salobj/src/generics/set_log_level.rs index 96e9e9d..b7a2745 100644 --- a/salobj/src/generics/set_log_level.rs +++ b/salobj/src/generics/set_log_level.rs @@ -43,7 +43,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("command_setLogLevel").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("level", Value::Int(10)); topic_record.put("subsystem", Value::String("test".to_owned())); @@ -59,7 +59,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -68,7 +68,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/simulation_mode.rs b/salobj/src/generics/simulation_mode.rs index 0200a44..0d2a695 100644 --- a/salobj/src/generics/simulation_mode.rs +++ b/salobj/src/generics/simulation_mode.rs @@ -39,7 +39,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_simulationMode").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("mode", Value::Int(0)); topic_record.put("private_sndStamp", Value::Double(1.234)); @@ -53,7 +53,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -62,7 +62,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/software_version.rs b/salobj/src/generics/software_version.rs index 9229822..d99a33a 100644 --- a/salobj/src/generics/software_version.rs +++ b/salobj/src/generics/software_version.rs @@ -60,7 +60,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_softwareVersions").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("salVersion", Value::String("vX.Y.Z".to_owned())); topic_record.put("xmlVersion", Value::String("vX.Y.Z".to_owned())); @@ -79,7 +79,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -88,7 +88,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/standby.rs b/salobj/src/generics/standby.rs index bdcca1b..b2a54b1 100644 --- a/salobj/src/generics/standby.rs +++ b/salobj/src/generics/standby.rs @@ -31,7 +31,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("command_standby").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("private_sndStamp", Value::Double(1.234)); topic_record.put("private_origin", Value::Int(123)); @@ -44,7 +44,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -53,7 +53,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/start.rs b/salobj/src/generics/start.rs index b423c0d..411bca2 100644 --- a/salobj/src/generics/start.rs +++ b/salobj/src/generics/start.rs @@ -40,7 +40,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("command_start").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put( "configurationOverride", @@ -58,7 +58,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -67,7 +67,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/status_code.rs b/salobj/src/generics/status_code.rs index 6ac3034..de70240 100644 --- a/salobj/src/generics/status_code.rs +++ b/salobj/src/generics/status_code.rs @@ -40,7 +40,7 @@ mod tests { .collect(); let topic_schema = avro_schema.get("logevent_statusCode").unwrap(); - let mut topic_record = Record::new(&topic_schema).unwrap(); + let mut topic_record = Record::new(topic_schema).unwrap(); topic_record.put("mask", Value::Int(0)); topic_record.put("private_sndStamp", Value::Double(1.234)); @@ -54,7 +54,7 @@ mod tests { topic_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &topic_schema, + topic_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -63,7 +63,7 @@ mod tests { writer.append(topic_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&topic_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(topic_schema, &input[..]).unwrap(); for record in reader { let topic = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/generics/summary_state.rs b/salobj/src/generics/summary_state.rs index 221a499..a2b5b7b 100644 --- a/salobj/src/generics/summary_state.rs +++ b/salobj/src/generics/summary_state.rs @@ -54,7 +54,7 @@ mod tests { .collect(); let summary_state_schema = avro_schema.get("logevent_summaryState").unwrap(); - let mut summary_state_record = Record::new(&summary_state_schema).unwrap(); + let mut summary_state_record = Record::new(summary_state_schema).unwrap(); summary_state_record.put("summaryState", Value::Int(2)); summary_state_record.put("private_sndStamp", Value::Double(1.234)); @@ -68,7 +68,7 @@ mod tests { summary_state_record.put("private_revCode", Value::String("xyz".to_string())); let mut writer = Writer::with_codec( - &summary_state_schema, + summary_state_schema, Vec::new(), Codec::Deflate(DeflateSettings::new( miniz_oxide::deflate::CompressionLevel::NoCompression, @@ -77,7 +77,7 @@ mod tests { writer.append(summary_state_record).unwrap(); let input = writer.into_inner().unwrap(); - let reader = Reader::with_schema(&summary_state_schema, &input[..]).unwrap(); + let reader = Reader::with_schema(summary_state_schema, &input[..]).unwrap(); for record in reader { let summary_state = from_value::(&record.unwrap()).unwrap(); diff --git a/salobj/src/sal_info.rs b/salobj/src/sal_info.rs index 23af4d6..59834c0 100644 --- a/salobj/src/sal_info.rs +++ b/salobj/src/sal_info.rs @@ -424,7 +424,7 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); // This will panic if fails to get ackcmd - sal_info.get_topic_info(&"ackcmd").unwrap(); + sal_info.get_topic_info("ackcmd").unwrap(); } #[test] @@ -432,7 +432,7 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); // This will panic if fails to get command - sal_info.get_topic_info(&"command_start").unwrap(); + sal_info.get_topic_info("command_start").unwrap(); } #[test] @@ -441,7 +441,7 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); // This will panic if fails to get command - sal_info.get_topic_info(&"command_startBad").unwrap(); + sal_info.get_topic_info("command_startBad").unwrap(); } #[test] @@ -449,7 +449,7 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); // This will panic if fails to get event - sal_info.get_topic_info(&"logevent_scalars").unwrap(); + sal_info.get_topic_info("logevent_scalars").unwrap(); } #[test] @@ -458,7 +458,7 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); // This will panic if fails to get event - sal_info.get_topic_info(&"logevent_scalarsBad").unwrap(); + sal_info.get_topic_info("logevent_scalarsBad").unwrap(); } #[test] @@ -466,7 +466,7 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); // This will panic if fails to get telemetry - sal_info.get_topic_info(&"scalars").unwrap(); + sal_info.get_topic_info("scalars").unwrap(); } #[test] @@ -475,6 +475,6 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); // This will panic if fails to get telemetry - sal_info.get_topic_info(&"scalarsBad").unwrap(); + sal_info.get_topic_info("scalarsBad").unwrap(); } } diff --git a/salobj/src/topics/write_topic.rs b/salobj/src/topics/write_topic.rs index 0024eef..a8c7b6a 100644 --- a/salobj/src/topics/write_topic.rs +++ b/salobj/src/topics/write_topic.rs @@ -258,7 +258,7 @@ mod tests { let sal_info = SalInfo::new("Test", 1).unwrap(); let write_topic = WriteTopic::new("scalars", &sal_info, &domain); - assert_eq!(write_topic.is_indexed(), true); + assert!(write_topic.is_indexed()); assert_eq!(write_topic.get_index(), 1); assert_eq!(write_topic.get_topic_name(), "scalars"); } diff --git a/salobj/src/utils/schema_utils.rs b/salobj/src/utils/schema_utils.rs index 30dd386..3ae5b9b 100644 --- a/salobj/src/utils/schema_utils.rs +++ b/salobj/src/utils/schema_utils.rs @@ -96,7 +96,7 @@ mod tests { let topic_schemas = glob_schema_files("Test").unwrap(); let hash_map_table_str = topic_schemas.get("Test_hash_table").unwrap(); - let hash_table = parse_hash_table(&hash_map_table_str).unwrap(); + let hash_table = parse_hash_table(hash_map_table_str).unwrap(); //for (key, value) in hash_table { // println!("{key}: {value}"); @@ -147,7 +147,7 @@ mod tests { && !topic_name.contains("global_enums") && !topic_name.contains("hash_table") { - let _ = Schema::parse_str(&topic_schema).unwrap(); + let _ = Schema::parse_str(topic_schema).unwrap(); } } } From 123853fffae5c830fa8b77e9e52833add1cf756e Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 16 Feb 2026 21:40:07 -0300 Subject: [PATCH 4/5] In ``salobj/src/topics/topic_info.rs``, remove dead code. --- salobj/src/topics/topic_info.rs | 130 -------------------------------- 1 file changed, 130 deletions(-) diff --git a/salobj/src/topics/topic_info.rs b/salobj/src/topics/topic_info.rs index 6a532e5..ea3489e 100644 --- a/salobj/src/topics/topic_info.rs +++ b/salobj/src/topics/topic_info.rs @@ -143,133 +143,3 @@ impl TopicInfo { } } } - -#[cfg(test)] -mod tests { - use std::collections::HashSet; - - fn get_expected_ackcmd_fields(indexed: bool) -> HashSet { - let expected_ackcmd_fields = HashSet::from([ - String::from("ack"), - String::from("error"), - String::from("result"), - String::from("identity"), - String::from("origin"), - String::from("cmdtype"), - String::from("timeout"), - ]); - - let expected_private_fields = get_expected_private_fields(indexed); - - expected_ackcmd_fields - .into_iter() - .chain(expected_private_fields) - .collect() - } - - fn get_expected_private_fields(indexed: bool) -> HashSet { - let expected_private_fields = HashSet::from([ - String::from("salIndex"), - String::from("private_sndStamp"), - String::from("private_rcvStamp"), - String::from("private_efdStamp"), - String::from("private_kafkaStamp"), - String::from("private_seqNum"), - String::from("private_identity"), - String::from("private_revCode"), - String::from("private_origin"), - ]); - - if !indexed { - expected_private_fields - .into_iter() - .filter(|name| name != "salIndex") - .collect() - } else { - expected_private_fields - } - } - - // #[test] - // fn get_private_fields_indexed() { - // let private_fields = TopicInfo::get_private_fields(true); - - // assert!(private_fields.contains_key("salIndex")) - // } - - // #[test] - // fn get_private_fields_not_indexed() { - // let private_fields = TopicInfo::get_private_fields(false); - - // assert!(!private_fields.contains_key("salIndex")) - // } - - // fn check_ackcmd_fields_indexed(indexed: bool) -> bool { - // let ackcmd_fields = TopicInfo::get_ackcmd_fields(indexed); - - // let expected_ackcmd_field = get_expected_ackcmd_fields(indexed); - - // expected_ackcmd_field == ackcmd_fields.keys().cloned().collect() - // } - - // #[test] - // fn get_ackcmd_fields_indexed() { - // assert!(check_ackcmd_fields_indexed(true)) - // } - - // #[test] - // fn get_ackcmd_fields_not_indexed() { - // assert!(check_ackcmd_fields_indexed(false)) - // } - - // #[test] - // fn get_ackcmd_indexed() { - // let ack_cmd = TopicInfo::get_ackcmd("Test", "unit_test", true); - - // let expected_ackcmd_field = get_expected_ackcmd_fields(true); - - // assert_eq!(ack_cmd.component_name, "Test"); - // assert_eq!(ack_cmd.topic_subname, "unit_test"); - // assert_eq!(ack_cmd.topic_name, "ackcmd"); - // assert_eq!(ack_cmd.description, "Command acknowledgement"); - // assert_eq!( - // expected_ackcmd_field, - // ack_cmd.fields.keys().cloned().collect() - // ); - // } - - // #[test] - // fn get_ackcmd_not_indexed() { - // let ack_cmd = TopicInfo::get_ackcmd("Test", "unit_test", false); - - // let expected_ackcmd_field = get_expected_ackcmd_fields(false); - - // assert_eq!(ack_cmd.component_name, "Test"); - // assert_eq!(ack_cmd.topic_subname, "unit_test"); - // assert_eq!(ack_cmd.description, "Command acknowledgement"); - // assert_eq!( - // expected_ackcmd_field, - // ack_cmd.fields.keys().cloned().collect() - // ); - // } - - // #[test] - // fn make_avro_schema() { - // let ack_cmd = TopicInfo::get_ackcmd("Test", "unit_test", false); - // let ack_cmd_schema = serde_json::to_string(&ack_cmd.make_avro_schema()).unwrap(); - // let schema = Schema::parse_str(&ack_cmd_schema).unwrap(); - // let record = Record::new(&schema).unwrap(); - - // let record_fields: HashSet = - // record.fields.into_iter().map(|(field, _)| field).collect(); - // let expected_fields = ack_cmd.get_fields_name(); - // assert_eq!(record_fields, expected_fields) - // } - - // #[test] - // fn test_get_rev_code() { - // let ack_cmd = TopicInfo::get_ackcmd("Test", "unit_test", false); - // let ack_cmd_rev_code = ack_cmd.get_rev_code().unwrap(); - // assert_eq!(ack_cmd_rev_code, "abd3610e") - // } -} From 5fedefa8d69c98be06a8db1dad7716d8875358d1 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Mon, 16 Feb 2026 23:13:13 -0300 Subject: [PATCH 5/5] Update clippy check github workflow to clone ts-xml and set the TS_XML_DIR environment variable. --- .github/workflows/clippy_check.yaml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/.github/workflows/clippy_check.yaml b/.github/workflows/clippy_check.yaml index 31e3ec2..f92ec4e 100644 --- a/.github/workflows/clippy_check.yaml +++ b/.github/workflows/clippy_check.yaml @@ -6,6 +6,24 @@ jobs: clippy_check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout main repository + uses: actions/checkout@v4 + with: + path: salobj + + - name: Checkout public dependency repository + uses: actions/checkout@v4 + with: + repository: 'lsst-ts/ts_xml' + path: ts_xml + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: clippy + - name: Run Clippy - run: cargo clippy --all-targets --all-features + working-directory: ./salobj + env: + TS_XML_DIR: ${{ github.workspace }}/ts_xml/python/lsst/ts/xml/data/sal_interfaces + run: cargo clippy --all-targets --all-features