use std::net::SocketAddr;
use std::time::{Duration, SystemTime};
use structopt::StructOpt;
use dsf_core::types::*;
use crate::helpers::{parse_duration, try_parse_sock_addr};
use crate::ServiceIdentifier;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Display)]
pub enum PeerState {
Unknown,
Known(PublicKey),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum PeerAddress {
Implicit(Address),
Explicit(Address),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "diesel", derive(diesel::Queryable))]
pub struct PeerInfo {
pub id: Id,
pub index: usize,
pub address: PeerAddress,
pub state: PeerState,
pub seen: Option<SystemTime>,
pub sent: u64,
pub received: u64,
pub blocked: bool,
}
impl PeerInfo {
pub fn new(
id: Id,
address: PeerAddress,
state: PeerState,
index: usize,
seen: Option<SystemTime>,
) -> Self {
Self {
id,
address,
state,
seen,
index,
sent: 0,
received: 0,
blocked: false,
}
}
pub fn address(&self) -> &Address {
match &self.address {
PeerAddress::Explicit(e) => e,
PeerAddress::Implicit(i) => i,
}
}
pub fn update_address(&mut self, addr: PeerAddress) {
use PeerAddress::*;
match (&self.address, &addr) {
(_, Explicit(_)) => self.address = addr,
(Implicit(_), Implicit(_)) => self.address = addr,
_ => (),
}
}
pub fn state(&self) -> &PeerState {
&self.state
}
pub fn set_state(&mut self, state: PeerState) {
self.state = state;
}
pub fn seen(&self) -> Option<SystemTime> {
self.seen
}
pub fn set_seen(&mut self, seen: SystemTime) {
self.seen = Some(seen);
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, StructOpt)]
pub enum PeerCommands {
#[structopt(name = "list")]
List(PeerOptions),
#[structopt(name = "connect")]
Connect(ConnectOptions),
#[structopt(name = "info")]
Info(ServiceIdentifier),
#[structopt(name = "search")]
Search(SearchOptions),
#[structopt(name = "remove")]
Remove(ServiceIdentifier),
#[structopt(name = "block")]
Block(ServiceIdentifier),
#[structopt(name = "unblock")]
Unblock(ServiceIdentifier),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, StructOpt)]
pub struct ConnectOptions {
#[structopt(parse(try_from_str = try_parse_sock_addr))]
pub address: SocketAddr,
#[structopt(short = "i", long = "id")]
pub id: Option<Id>,
#[structopt(short = "t", long = "timeout", parse(try_from_str = parse_duration))]
pub timeout: Option<Duration>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, StructOpt)]
pub struct PeerOptions {}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, StructOpt)]
pub struct SearchOptions {
#[structopt(short = "i", long = "id")]
pub id: Id,
#[structopt(short = "t", long = "timeout", parse(try_from_str = parse_duration))]
pub timeout: Option<Duration>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ConnectInfo {
pub id: Id,
pub peers: usize,
}