use std::collections::HashMap;
use std::net::{IpAddr, Ipv6Addr, SocketAddr};
use futures::{Future, future};
use Error;
use service::locator::Locator;
pub trait Resolve {
type Future: Future<Item = ResolveInfo<SocketAddr>, Error = Error>;
fn resolve(&self, name: &str) -> Self::Future;
}
#[derive(Clone, Debug, Deserialize)]
pub struct GraphNode {
pub event: String,
pub rx: Option<HashMap<u64, GraphNode>>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct EventGraph {
pub name: String,
pub tx: HashMap<u64, GraphNode>,
pub rx: HashMap<u64, GraphNode>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct ResolveInfo<T> {
pub(crate) addrs: Vec<T>,
pub(crate) version: u64,
pub(crate) methods: HashMap<u64, EventGraph>,
}
impl ResolveInfo<SocketAddr> {
pub fn addrs(&self) -> &[SocketAddr] {
&self.addrs
}
}
#[derive(Clone, Debug)]
pub struct FixedResolver {
addrs: Vec<SocketAddr>,
}
impl FixedResolver {
pub fn new(addrs: Vec<SocketAddr>) -> Self {
Self { addrs }
}
pub fn addrs(&self) -> &[SocketAddr] {
&self.addrs
}
}
impl Default for FixedResolver {
fn default() -> Self {
Self {
addrs: vec![
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), 10053),
],
}
}
}
impl Resolve for FixedResolver {
type Future = future::FutureResult<ResolveInfo<SocketAddr>, Error>;
fn resolve(&self, _name: &str) -> Self::Future {
let result = ResolveInfo {
addrs: self.addrs.clone(),
version: 1,
methods: HashMap::new(),
};
future::ok(result)
}
}
#[derive(Clone, Debug)]
pub struct Resolver {
locator: Locator,
}
impl Resolver {
pub fn new(locator: Locator) -> Self {
Self { locator }
}
}
impl Resolve for Resolver {
type Future = Box<Future<Item = ResolveInfo<SocketAddr>, Error = Error>>;
fn resolve(&self, name: &str) -> Self::Future {
Box::new(self.locator.resolve(name))
}
}
fn _assert_kinds() {
fn _assert_send<T: Send>() {}
fn _assert_sync<T: Sync>() {}
fn _assert_clone<T: Clone>() {}
_assert_send::<Resolver>();
_assert_sync::<Resolver>();
_assert_clone::<Resolver>();
}
#[cfg(test)]
mod test {
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
use super::FixedResolver;
#[test]
fn fixed_resolver_saves_addrs() {
let addrs = vec![
SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 10053),
];
let resolver = FixedResolver::new(addrs.clone());
assert_eq!(addrs, resolver.addrs());
}
#[test]
fn fixed_resolver_default_addrs() {
let resolver = FixedResolver::default();
assert_eq!(
vec![
SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), 10053),
],
resolver.addrs()
);
}
}