Skip to main content

fips_core/control/
commands.rs

1//! Mutating control socket commands.
2//!
3//! Commands that modify node state (connect, disconnect) are handled here,
4//! separate from read-only queries in `queries.rs`.
5
6use super::protocol::Response;
7use crate::node::Node;
8use serde_json::Value;
9use tracing::debug;
10
11/// Dispatch a mutating command to the appropriate handler.
12pub async fn dispatch(node: &mut Node, command: &str, params: Option<&Value>) -> Response {
13    match command {
14        "connect" => connect(node, params).await,
15        "disconnect" => disconnect(node, params),
16        _ => Response::error(format!("unknown command: {command}")),
17    }
18}
19
20/// Connect to a peer.
21///
22/// Params: `{"npub": "npub1...", "address": "host:port", "transport": "udp"}`
23async fn connect(node: &mut Node, params: Option<&Value>) -> Response {
24    let Some(params) = params else {
25        return Response::error("missing params for connect");
26    };
27
28    let npub = match params.get("npub").and_then(|v| v.as_str()) {
29        Some(v) => v,
30        None => return Response::error("missing 'npub' parameter"),
31    };
32    let address = match params.get("address").and_then(|v| v.as_str()) {
33        Some(v) => v,
34        None => return Response::error("missing 'address' parameter"),
35    };
36    let transport = match params.get("transport").and_then(|v| v.as_str()) {
37        Some(v) => v,
38        None => return Response::error("missing 'transport' parameter"),
39    };
40
41    debug!(npub = %npub, address = %address, transport = %transport, "API connect requested");
42
43    match node.api_connect(npub, address, transport).await {
44        Ok(data) => Response::ok(data),
45        Err(msg) => Response::error(msg),
46    }
47}
48
49/// Disconnect a peer.
50///
51/// Params: `{"npub": "npub1..."}`
52fn disconnect(node: &mut Node, params: Option<&Value>) -> Response {
53    let Some(params) = params else {
54        return Response::error("missing params for disconnect");
55    };
56
57    let npub = match params.get("npub").and_then(|v| v.as_str()) {
58        Some(v) => v,
59        None => return Response::error("missing 'npub' parameter"),
60    };
61
62    debug!(npub = %npub, "API disconnect requested");
63
64    match node.api_disconnect(npub) {
65        Ok(data) => Response::ok(data),
66        Err(msg) => Response::error(msg),
67    }
68}