use std::sync::Arc;
use std::any::Any;
use iron::{headers, status, Request, Response, IronResult, method};
use iron::middleware::{BeforeMiddleware, Handler};
use middleware::{ActualParserMiddleware, IdParser};
use types::{Id, ParserMiddleware};
pub struct Parsers<OpP: ParserMiddleware, BoP: ParserMiddleware> {
pub id_parser: Arc<Box<BeforeMiddleware>>,
pub option_parser: Arc<ActualParserMiddleware<OpP>>,
pub body_parser: Arc<ActualParserMiddleware<BoP>>
}
impl<OpP, BoP> Parsers<OpP, BoP>
where OpP: ParserMiddleware, BoP: ParserMiddleware
{
pub fn new<Idt: Send+Sync+Any>(option_parser: OpP, body_parser: BoP) -> Self
where Idt: Id {
Parsers {
id_parser: Arc::new(Box::new(IdParser::<Idt>::new())),
option_parser: Arc::new(ActualParserMiddleware::new(option_parser)),
body_parser: Arc::new(ActualParserMiddleware::new(body_parser))
}
}
}
pub struct OptionHandler(headers::Allow);
impl OptionHandler {
pub fn new(methods: Vec<method::Method>) -> OptionHandler {
OptionHandler(headers::Allow(methods))
}
}
impl Handler for OptionHandler {
fn handle(&self, _: &mut Request) -> IronResult<Response> {
let mut response = Response::with(status::Ok);
response.headers.set::<headers::Allow>(self.0.clone());
Ok(response)
}
}