use std::collections::hash_map::{HashMap, Entry};
use router::{Router, Endpoint, InsertState, RouteState};
use context::hypermedia::Link;
use handler::Factory;
use Method;
#[derive(Clone)]
pub struct OrElse<R, H> {
router: R,
default: H,
}
impl<R, H> OrElse<R, H> {
pub fn new(inner: R, default: H) -> OrElse<R, H> {
OrElse {
router: inner,
default: default,
}
}
}
impl<Inner: Router<Handler=H>, H: Factory> Router for OrElse<Inner, H> {
type Handler = Inner::Handler;
fn find<'a>(&'a self, method: &Method, route: &mut RouteState) -> Endpoint<'a, H> {
let mut endpoint = self.router.find(method, route);
endpoint.handler = endpoint.handler.or(Some(&self.default));
endpoint
}
fn hyperlinks<'a>(&'a self, base: Link<'a>) -> Vec<Link<'a>> {
self.router.hyperlinks(base)
}
fn build<'a, R: Into<InsertState<'a, I>>, I: Iterator<Item = &'a [u8]>>(method: Method, route: R, item: H) -> OrElse<Inner, H> {
unimplemented!()
}
fn insert<'a, R: Into<InsertState<'a, I>>, I: Iterator<Item = &'a [u8]>>(&mut self, method: Method, route: R, item: H) {
self.router.insert(method, route, item)
}
fn insert_router<'a, R: Into<InsertState<'a, I>>, I: Clone + Iterator<Item = &'a [u8]>>(&mut self, route: R, router: OrElse<Inner, H>) {
self.default = router.default;
self.router.insert_router(route, router.router);
}
fn prefix<'a, R: Into<InsertState<'a, I>>, I: Clone + Iterator<Item = &'a [u8]>>(&mut self, route: R) {
self.router.prefix(rotue)
}
}
impl<T: Default, H: Default> Default for OrElse<T, H> {
fn default() -> OrElse<T, H> {
OrElse {
router: T::default(),
default: H::default(),
}
}
}