Radish alpha
h
Radicle Heartwood Protocol & Stack
Radicle
Git (anonymous pull)
Log in to clone via SSH
naive implementation
Johannes Kühlewindt committed 10 months ago
commit 3b2572e73e13a3f48167a786c123d7c2125c6bba
parent 76e00a34ea58c2d424347323eba4623eb487b19c
1 file changed +29 -3
modified crates/radicle-cli/src/commands/node.rs
@@ -1,14 +1,17 @@
use std::ffi::OsString;
use std::path::PathBuf;
+
use std::str::FromStr;
use std::time;

use anyhow::anyhow;

+
use radicle::node::address::Store as AddressStore;
use radicle::node::config::ConnectAddress;
use radicle::node::routing::Store;
-
use radicle::node::Handle as _;
use radicle::node::{Address, Node, NodeId, PeerAddr};
+
use radicle::node::{Handle as _, HostName};
use radicle::prelude::RepoId;
+
use radicle_crypto::PublicKey;

use crate::terminal as term;
use crate::terminal::args::{Args, Error, Help};
@@ -35,7 +38,7 @@ Usage
    rad node stop [<option>...]
    rad node logs [-n <lines>]
    rad node debug [<option>...]
-
    rad node connect <nid>@<addr> [<option>...]
+
    rad node connect <nid>[@<addr>] [<option>...]
    rad node routing [--rid <rid>] [--nid <nid>] [--json] [<option>...]
    rad node inventory [--nid <nid>] [<option>...]
    rad node events [--timeout <secs>] [-n <count>] [<option>...]
@@ -171,7 +174,29 @@ impl Args for Options {
                    unknown => anyhow::bail!("unknown operation '{}'", unknown),
                },
                Value(val) if matches!(op, Some(OperationName::Connect)) => {
-
                    addr = Some(val.parse()?);
+
                    addr = if let Some(connect_string) = val.to_str() {
+
                        if connect_string.contains('@') {
+
                            Some(connect_string.parse()?)
+
                        } else {
+
                            let profile = radicle::Profile::load()?;
+
                            let db = profile.database()?;
+

+
                            let known_addresses =
+
                                db.addresses_of(&PublicKey::from_str(connect_string)?)?;
+

+
                            let guess = known_addresses
+
                                .iter()
+
                                .find(|known_address| {
+
                                    matches!(&known_address.addr.host, HostName::Dns(_))
+
                                })
+
                                .ok_or(anyhow!("couldn't find a public address for the node"))?;
+
                            let address = guess.addr.to_string();
+

+
                            Some(format!("{connect_string}@{address}").parse()?)
+
                        }
+
                    } else {
+
                        None
+
                    }
                }
                Long("rid") if matches!(op, Some(OperationName::Routing)) => {
                    let val = parser.value()?;
@@ -223,6 +248,7 @@ impl Args for Options {

        let op = match op.unwrap_or_default() {
            OperationName::Connect => Operation::Connect {
+
                // TODO implement
                addr: addr.ok_or_else(|| {
                    anyhow!("an address of the form `<nid>@<host>:<port>` must be provided")
                })?,