use std::{collections::BTreeSet, net::SocketAddr};
use serde::{Deserialize, Serialize};
use crate::{NodeId, PublicKey, RelayUrl};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct NodeAddr {
pub node_id: NodeId,
pub relay_url: Option<RelayUrl>,
pub direct_addresses: BTreeSet<SocketAddr>,
}
impl NodeAddr {
pub fn new(node_id: PublicKey) -> Self {
NodeAddr {
node_id,
relay_url: None,
direct_addresses: Default::default(),
}
}
pub fn with_relay_url(mut self, relay_url: RelayUrl) -> Self {
self.relay_url = Some(relay_url);
self
}
pub fn with_direct_addresses(
mut self,
addresses: impl IntoIterator<Item = SocketAddr>,
) -> Self {
self.direct_addresses = addresses.into_iter().collect();
self
}
pub fn from_parts(
node_id: PublicKey,
relay_url: Option<RelayUrl>,
direct_addresses: impl IntoIterator<Item = SocketAddr>,
) -> Self {
Self {
node_id,
relay_url,
direct_addresses: direct_addresses.into_iter().collect(),
}
}
pub fn is_empty(&self) -> bool {
self.relay_url.is_none() && self.direct_addresses.is_empty()
}
pub fn direct_addresses(&self) -> impl Iterator<Item = &SocketAddr> {
self.direct_addresses.iter()
}
pub fn relay_url(&self) -> Option<&RelayUrl> {
self.relay_url.as_ref()
}
}
impl From<(PublicKey, Option<RelayUrl>, &[SocketAddr])> for NodeAddr {
fn from(value: (PublicKey, Option<RelayUrl>, &[SocketAddr])) -> Self {
let (node_id, relay_url, direct_addresses_iter) = value;
NodeAddr {
node_id,
relay_url,
direct_addresses: direct_addresses_iter.iter().copied().collect(),
}
}
}
impl From<NodeId> for NodeAddr {
fn from(node_id: NodeId) -> Self {
NodeAddr::new(node_id)
}
}