extern crate semver;
use std::io::prelude::*;
use std::collections::HashMap;
use std::error::Error;
use std::net::SocketAddr;
pub use self::typemap::TypeMap;
mod typemap;
#[derive(PartialEq, Debug, Clone, Copy)]
pub enum Scheme {
Http,
Https
}
#[derive(PartialEq, Debug, Clone, Copy)]
pub enum Host<'a> {
Name(&'a str),
Socket(SocketAddr)
}
#[derive(PartialEq, Hash, Eq, Debug, Clone, Copy)]
pub enum Method {
Get,
Post,
Put,
Delete,
Head,
Connect,
Options,
Trace,
Patch,
Purge,
Other(&'static str)
}
pub type Extensions = TypeMap;
pub trait Request {
fn http_version(&self) -> semver::Version;
fn conduit_version(&self) -> semver::Version;
fn method(&self) -> Method;
fn scheme(&self) -> Scheme;
fn host<'a>(&'a self) -> Host<'a>;
fn virtual_root<'a>(&'a self) -> Option<&'a str>;
fn path<'a>(&'a self) -> &'a str;
fn query_string<'a>(&'a self) -> Option<&'a str>;
fn remote_addr(&self) -> SocketAddr;
fn content_length(&self) -> Option<u64>;
fn headers<'a>(&'a self) -> &'a Headers;
fn body<'a>(&'a mut self) -> &'a mut Read;
fn extensions<'a>(&'a self) -> &'a Extensions;
fn mut_extensions<'a>(&'a mut self) -> &'a mut Extensions;
}
pub trait Headers {
fn find(&self, key: &str) -> Option<Vec<&str>>;
fn has(&self, key: &str) -> bool;
fn all(&self) -> Vec<(&str, Vec<&str>)>;
}
pub struct Response {
pub status: (u32, &'static str),
pub headers: HashMap<String, Vec<String>>,
pub body: Box<Read + Send>
}
pub trait Handler: Sync + Send + 'static {
fn call(&self, request: &mut Request) -> Result<Response, Box<Error+Send>>;
}
impl<F, E> Handler for F
where F: Fn(&mut Request) -> Result<Response, E> + Sync + Send + 'static,
E: Error + Send + 'static
{
fn call(&self, request: &mut Request) -> Result<Response, Box<Error+Send>> {
(*self)(request).map_err(|e| Box::new(e) as Box<Error+Send>)
}
}