mesh_llm_cli/parser/
validation.rs1use super::commands::{Cli, Command, MeshDiscoveryMode};
2
3pub fn validate_discovery_mode_args(cli: &Cli) -> anyhow::Result<()> {
4 if cli.mesh_discovery_mode != MeshDiscoveryMode::Mdns {
5 return Ok(());
6 }
7
8 if !cli.nostr_relay.is_empty() {
9 anyhow::bail!("--nostr-relay is only valid with --mesh-discovery-mode nostr");
10 }
11 if !cli.relay.is_empty() {
12 anyhow::bail!("--relay is only valid with --mesh-discovery-mode nostr");
13 }
14 if !cli.relay_auth.is_empty() {
15 anyhow::bail!("--relay-auth is only valid with --mesh-discovery-mode nostr");
16 }
17 if let Some(Command::Discover { relay, .. }) = cli.command.as_ref()
18 && !relay.is_empty()
19 {
20 anyhow::bail!("discover --relay is only valid with --mesh-discovery-mode nostr");
21 }
22
23 Ok(())
24}
25
26#[cfg(test)]
27mod tests {
28 use crate::parser::{Cli, normalize_runtime_surface_args, validate_discovery_mode_args};
29 use clap::Parser;
30
31 #[test]
32 fn cli_rejects_nostr_relays_in_mdns_mode() {
33 let normalized = normalize_runtime_surface_args([
34 "mesh-llm",
35 "serve",
36 "--mesh-discovery-mode",
37 "mdns",
38 "--nostr-relay",
39 "wss://relay.example",
40 ]);
41 let cli = Cli::parse_from(normalized.normalized);
42
43 let err = validate_discovery_mode_args(&cli)
44 .expect_err("mdns mode must reject Nostr relay overrides");
45 assert!(err.to_string().contains("--nostr-relay"));
46 }
47
48 #[test]
49 fn cli_rejects_iroh_relays_in_mdns_mode() {
50 let normalized = normalize_runtime_surface_args([
51 "mesh-llm",
52 "serve",
53 "--mesh-discovery-mode",
54 "mdns",
55 "--relay",
56 "https://relay.example/",
57 ]);
58 let cli = Cli::parse_from(normalized.normalized);
59
60 let err = validate_discovery_mode_args(&cli)
61 .expect_err("mdns mode must reject iroh relay overrides");
62 assert!(err.to_string().contains("--relay"));
63 }
64
65 #[test]
66 fn cli_rejects_relay_auth_in_mdns_mode() {
67 let normalized = normalize_runtime_surface_args([
68 "mesh-llm",
69 "serve",
70 "--mesh-discovery-mode",
71 "mdns",
72 "--relay-auth",
73 "https://relay.example/=secret-token",
74 ]);
75 let cli = Cli::parse_from(normalized.normalized);
76
77 let err = validate_discovery_mode_args(&cli).expect_err("mdns mode must reject relay auth");
78 assert!(err.to_string().contains("--relay-auth"));
79 }
80}