use tetsy_libp2p_core::Multiaddr;
use smallvec::SmallVec;
use std::fmt;
#[derive(Clone)]
pub struct Addresses {
addrs: SmallVec<[Multiaddr; 6]>,
}
#[allow(clippy::len_without_is_empty)]
impl Addresses {
pub fn new(addr: Multiaddr) -> Addresses {
let mut addrs = SmallVec::new();
addrs.push(addr);
Addresses { addrs }
}
pub fn first(&self) -> &Multiaddr {
&self.addrs[0]
}
pub fn iter(&self) -> impl Iterator<Item = &Multiaddr> {
self.addrs.iter()
}
pub fn len(&self) -> usize {
self.addrs.len()
}
pub fn into_vec(self) -> Vec<Multiaddr> {
self.addrs.into_vec()
}
pub fn remove(&mut self, addr: &Multiaddr) -> Result<(),()> {
if self.addrs.len() == 1 {
return Err(())
}
if let Some(pos) = self.addrs.iter().position(|a| a == addr) {
self.addrs.remove(pos);
if self.addrs.len() <= self.addrs.inline_size() {
self.addrs.shrink_to_fit();
}
}
Ok(())
}
pub fn insert(&mut self, addr: Multiaddr) -> bool {
if self.addrs.iter().all(|a| *a != addr) {
self.addrs.push(addr);
true
} else {
false
}
}
pub fn replace(&mut self, old: &Multiaddr, new: &Multiaddr) -> bool {
if let Some(a) = self.addrs.iter_mut().find(|a| *a == old) {
*a = new.clone();
return true
}
false
}
}
impl fmt::Debug for Addresses {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_list()
.entries(self.addrs.iter())
.finish()
}
}