use std::borrow::ToOwned;
use hyper;
use hyper::mime::Mime;
pub use hyper::server::Listening;
use filter::{ContextFilter, ResponseFilter};
use router::Router;
use handler::Handler;
use HttpResult;
pub use self::instance::ServerInstance;
pub use self::config::{Host, Global, Scheme, KeepAlive};
mod instance;
mod config;
pub struct Server<R: Router> {
pub handlers: R,
pub fallback_handler: Option<R::Handler>,
pub host: Host,
pub scheme: Scheme,
pub threads: Option<usize>,
pub keep_alive: Option<KeepAlive>,
pub server: String,
pub content_type: Mime,
pub global: Global,
pub context_filters: Vec<Box<ContextFilter>>,
pub response_filters: Vec<Box<ResponseFilter>>
}
impl<R: Router> Server<R> {
pub fn new(handlers: R) -> Server<R> {
Server {
handlers: handlers,
fallback_handler: None,
host: 80.into(),
scheme: Scheme::Http,
threads: None,
keep_alive: None,
server: "rustful".to_owned(),
content_type: Mime(
hyper::mime::TopLevel::Text,
hyper::mime::SubLevel::Plain,
vec![(hyper::mime::Attr::Charset, hyper::mime::Value::Utf8)]
),
global: Global::default(),
context_filters: Vec::new(),
response_filters: Vec::new(),
}
}
pub fn run(self) -> HttpResult<Listening> {
let (server, scheme) = self.build();
server.run(scheme)
}
pub fn build(self) -> (ServerInstance<R>, Scheme) {
ServerInstance::new(self)
}
}
impl<R: Router + Default> Default for Server<R> {
fn default() -> Server<R> {
Server::new(R::default())
}
}