use std::{
io::{Error, ErrorKind},
net::{SocketAddr, ToSocketAddrs},
};
pub(crate) const STD_NAME_RESOLVER_PROVIDER: StdAddrResolverProvider = StdAddrResolverProvider;
pub trait AddrResolverProvider {
fn start(&self, s: String) -> Box<dyn AddrResolver>;
}
pub trait AddrResolver: Send {
fn poll(&mut self) -> Result<AddrResolutionOutcome, Error>;
}
pub enum AddrResolutionOutcome {
Idle,
Active,
Resolved(Vec<SocketAddr>),
}
pub struct StdAddrResolverProvider;
impl AddrResolverProvider for StdAddrResolverProvider {
fn start(&self, s: String) -> Box<dyn AddrResolver> {
Box::new(StdAddrResolver { s: Some(s) })
}
}
pub struct StdAddrResolver {
s: Option<String>,
}
impl AddrResolver for StdAddrResolver {
fn poll(&mut self) -> Result<AddrResolutionOutcome, Error> {
match self.s.take() {
Some(x) => x
.to_socket_addrs()
.map(|x| AddrResolutionOutcome::Resolved(x.collect())),
None => Err(Error::new(ErrorKind::Other, "done!")),
}
}
}