diff --git a/CLAUDE.md b/CLAUDE.md index b6da9ce2..5981235c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,6 +24,12 @@ cargo test -p trx-core ./target/release/trx-server --print-config > trx-server.toml ./target/release/trx-client --print-config > trx-client.toml +# Validate a config without starting anything (reports every problem) +./target/release/trx-server --check-config --config trx-rs.toml + +# Regenerate trx-rs.toml.example after changing a config struct +cargo run -p trx-config --example generate_example + # Run server ./target/release/trx-server --config trx-server.toml # or via CLI args: @@ -41,7 +47,8 @@ This is a Cargo workspace. All crates live under `src/`: src/ trx-core/ # Core types, traits, state machine, controller (~3,500 LOC) trx-protocol/ # Client↔server protocol DTOs, auth, codec, mapping (~1,100 LOC) - trx-app/ # Shared application helpers (config paths, logging init) + trx-app/ # Shared application helpers (logging init, name normalization) + trx-config/ # Client + server config structs, loader, validators (~2,500 LOC) trx-reporting/ # PSKReporter UDP uplink + APRS-IS TCP uplink (~1,150 LOC) trx-server/ # Server binary: rig_task, audio pipeline, listener (~3,700 LOC) trx-backend/ # Backend abstraction trait + factory + dummy diff --git a/src/trx-config/src/client.rs b/src/trx-config/src/client.rs index d7a34e5c..0eb1c17e 100644 --- a/src/trx-config/src/client.rs +++ b/src/trx-config/src/client.rs @@ -1523,17 +1523,19 @@ url = "remote.example.com:4530" #[test] fn test_remote_token_file_fills_token() { let f = secret_file("remote-token"); - let mut config = ClientConfig::default(); - config.remotes = vec![RemoteEntry { - name: "hf".to_string(), - url: "127.0.0.1:4530".to_string(), - rig_id: None, - auth: RemoteAuthConfig { - token: None, - token_file: Some(f.path().to_str().unwrap().to_string()), - }, - poll_interval_ms: 750, - }]; + let mut config = ClientConfig { + remotes: vec![RemoteEntry { + name: "hf".to_string(), + url: "127.0.0.1:4530".to_string(), + rig_id: None, + auth: RemoteAuthConfig { + token: None, + token_file: Some(f.path().to_str().unwrap().to_string()), + }, + poll_interval_ms: 750, + }], + ..Default::default() + }; config.resolve_secrets(None).unwrap(); assert_eq!(config.remotes[0].auth.token.as_deref(), Some("remote-token")); } diff --git a/src/trx-config/src/example.rs b/src/trx-config/src/example.rs index 9537a332..2203251c 100644 --- a/src/trx-config/src/example.rs +++ b/src/trx-config/src/example.rs @@ -196,7 +196,6 @@ fn annotate(doc: &mut DocumentMut, path: &str, comment: &str) { #[cfg(test)] mod tests { use super::*; - use crate::ConfigFile; /// The checked-in example must match what the structs produce, so a new /// config field cannot land without showing up in the example.