use std::{fmt::Display, str::FromStr};
use anyhow::Error;
use veilid_core::RecordKey;
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct DHTAddr {
pub key: RecordKey,
pub subkey: u16,
}
impl DHTAddr {
pub fn new(key: RecordKey, subkey: u16) -> DHTAddr {
Self { key, subkey }
}
}
impl Display for DHTAddr {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}:{}", self.key, self.subkey)
}
}
impl FromStr for DHTAddr {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.rsplit_once(":") {
Some((key_str, subkey_str)) => Ok(DHTAddr {
key: key_str.parse()?,
subkey: subkey_str.parse()?,
}),
None => Err(anyhow::anyhow!("invalid address: {s}")),
}
}
}