Skip to main content

mesh_llm_cli/parser/
validation.rs

1use 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}