use std::collections::HashSet;
use std::io::Error;
use std::net::{SocketAddr, ToSocketAddrs};
use crate::cluster::metadata::Peer;
pub trait HostFilter: Send + Sync {
fn accept(&self, peer: &Peer) -> bool;
}
pub struct AcceptAllHostFilter;
impl HostFilter for AcceptAllHostFilter {
fn accept(&self, _peer: &Peer) -> bool {
true
}
}
pub struct AllowListHostFilter {
allowed: HashSet<SocketAddr>,
}
impl AllowListHostFilter {
pub fn new<I, A>(allowed_iter: I) -> Result<Self, Error>
where
I: IntoIterator<Item = A>,
A: ToSocketAddrs,
{
let mut allowed = HashSet::new();
for item in allowed_iter {
for addr in item.to_socket_addrs()? {
allowed.insert(addr);
}
}
Ok(Self { allowed })
}
}
impl HostFilter for AllowListHostFilter {
fn accept(&self, peer: &Peer) -> bool {
match peer.address {
crate::cluster::NodeAddr::Translatable(addr) => self.allowed.contains(&addr),
crate::cluster::NodeAddr::Untranslatable(_) => true,
}
}
}
pub struct DcHostFilter {
local_dc: String,
}
impl DcHostFilter {
pub fn new(local_dc: String) -> Self {
Self { local_dc }
}
}
impl HostFilter for DcHostFilter {
fn accept(&self, peer: &Peer) -> bool {
peer.datacenter.as_ref() == Some(&self.local_dc)
}
}