use crust::{Endpoint, Port};
use std::collections::HashSet;
use std::net::SocketAddr;
use ip::IpAddr;
pub struct Acceptors {
endpoints: HashSet<::crust::Endpoint>,
bootstrap_ip: Option<IpAddr>,
tcp_accepting_port: Option<Port>,
utp_accepting_port: Option<Port>,
}
impl Acceptors {
pub fn new() -> Acceptors {
Acceptors {
endpoints: HashSet::new(),
bootstrap_ip: None,
tcp_accepting_port: None,
utp_accepting_port: None,
}
}
pub fn set_bootstrap_ip(&mut self, bootstrap_endpoint: Endpoint) {
self.bootstrap_ip = Some(Self::ip_from_socketaddr(bootstrap_endpoint.get_address()));
}
pub fn set_tcp_accepting_port(&mut self, accepting_port: Port) {
match accepting_port {
Port::Tcp(port) => {
self.tcp_accepting_port = Some(Port::Tcp(port));
if let Some(ref bootstrap_ip) = self.bootstrap_ip {
let _ = self.endpoints
.insert(Endpoint::new(bootstrap_ip.clone(), Port::Tcp(port)));
}
}
_ => unreachable!(),
}
}
#[allow(unused)]
pub fn set_utp_accepting_port(&mut self, accepting_port: Port) {
match accepting_port {
Port::Utp(port) => self.utp_accepting_port = Some(Port::Utp(port)),
_ => unreachable!(),
}
}
pub fn add(&mut self, our_endpoint: Endpoint) {
match our_endpoint {
Endpoint::Tcp(socket_addr) => {
if let Some(ref port) = self.tcp_accepting_port {
let _ = self.endpoints
.insert(Endpoint::new(Self::ip_from_socketaddr(socket_addr),
port.clone()));
}
}
Endpoint::Utp(socket_addr) => {
if let Some(ref port) = self.utp_accepting_port {
let _ = self.endpoints
.insert(Endpoint::new(Self::ip_from_socketaddr(socket_addr),
port.clone()));
}
}
}
}
pub fn endpoints(&self) -> Vec<Endpoint> {
self.endpoints.iter().cloned().collect()
}
fn ip_from_socketaddr(addr: SocketAddr) -> IpAddr {
match addr {
SocketAddr::V4(address) => IpAddr::V4(*address.ip()),
SocketAddr::V6(address) => IpAddr::V6(*address.ip()),
}
}
}