ns-router 0.1.6

A configurable name resolver for abstract-ns
Documentation
use std::fmt;

use abstract_ns::{Name, Error, Address, IpList};
use async_slot as slot;
use futures::sync::oneshot;

use coroutine::{Continuation};


#[derive(Debug)]
pub(crate) enum Request {
    ResolveHost(Name, oneshot::Sender<Result<IpList, Error>>),
    ResolveHostPort(Name, u16, oneshot::Sender<Result<Address, Error>>),
    Resolve(Name, oneshot::Sender<Result<Address, Error>>),
    HostSubscribe(Name, slot::Sender<IpList>),
    Subscribe(Name, slot::Sender<Address>),
    Task(Box<Continuation+Send>),
}

trait AssertTraits: Send {}
impl AssertTraits for Request {}

pub fn reply<X: Send + fmt::Debug + 'static>(name: &Name,
    tx: oneshot::Sender<Result<X, Error>>, value: X)
{
    tx.send(Ok(value))
        .map_err(|value| {
            trace!("{:?} resolved into {:?} but dropped",
                name, value.unwrap());
        })
        .ok();
}

pub fn fail<X: fmt::Debug>(name: &Name,
    tx: oneshot::Sender<Result<X, Error>>, error: Error)
{
    tx.send(Err(error))
        .map_err(|err| {
            trace!("{:?} resolved into, error but dropped: {}",
                name, err.unwrap_err());
        })
        .ok();
}