#![cfg(not(target_arch = "wasm32"))]
use crate::cli::address::{
deserialize_multiaddr, deserialize_socket_addr, deserialize_url, parse_cli_address,
};
use clap::{Parser, Subcommand};
use noosphere_core::data::{Did, LinkRecord};
use noosphere_ns::{DhtConfig, Multiaddr};
use serde::Deserialize;
use std::net::SocketAddr;
use std::path::PathBuf;
use url::Url;
#[derive(Parser)]
#[command(author, version, about, long_about=None, name = "orb-ns")]
pub struct CLI {
#[command(subcommand)]
pub command: CLICommand,
}
#[derive(Subcommand)]
pub enum CLICommand {
Run {
#[arg(short, long)]
config: Option<PathBuf>,
#[arg(short, long)]
key: Option<String>,
#[arg(
short,
long,
value_parser = parse_cli_address::<Multiaddr>
)]
listening_address: Option<Multiaddr>,
#[arg(
long,
value_parser = parse_cli_address::<SocketAddr>
)]
api_address: Option<SocketAddr>,
#[arg(short, long)]
peers: Option<Vec<Multiaddr>>,
#[arg(long, default_value_t = false)]
no_default_peers: bool,
#[arg(
long,
value_parser = parse_cli_address::<Url>
)]
ipfs_api_url: Option<Url>,
},
KeyGen {
#[arg(short, long)]
key: String,
},
Status {
#[arg(short, long, value_parser = parse_cli_address::<Url>)]
api_url: Url,
},
#[command(subcommand)]
Records(CLIRecords),
#[command(subcommand)]
Peers(CLIPeers),
}
#[derive(Subcommand)]
pub enum CLIRecords {
Get {
identity: Did,
#[arg(short, long, value_parser = parse_cli_address::<Url>)]
api_url: Url,
},
Put {
record: LinkRecord,
#[arg(short, long, value_parser = parse_cli_address::<Url>)]
api_url: Url,
},
}
#[derive(Subcommand)]
pub enum CLIPeers {
Ls {
#[arg(short, long, value_parser = parse_cli_address::<Url>)]
api_url: Url,
},
Add {
peer: Multiaddr,
#[arg(short, long, value_parser = parse_cli_address::<Url>)]
api_url: Url,
},
}
#[derive(Debug, Deserialize)]
pub struct CLIConfigFile {
pub key: String,
#[serde(default, deserialize_with = "deserialize_multiaddr")]
pub listening_address: Option<Multiaddr>,
#[serde(default, deserialize_with = "deserialize_socket_addr")]
pub api_address: Option<SocketAddr>,
#[serde(default)]
pub peers: Vec<Multiaddr>,
#[serde(default)]
pub no_default_peers: bool,
#[serde(default)]
pub dht_config: DhtConfig,
#[serde(default, deserialize_with = "deserialize_url")]
pub ipfs_api_url: Option<Url>,
}