2018-01-26 03:37:46 +00:00
|
|
|
#![feature(ascii_ctype)]
|
|
|
|
#![feature(conservative_impl_trait)]
|
2018-01-27 09:47:12 +00:00
|
|
|
#![feature(proc_macro)]
|
2018-01-26 03:37:46 +00:00
|
|
|
|
|
|
|
extern crate futures;
|
|
|
|
extern crate hyper;
|
|
|
|
extern crate hyper_tls;
|
2018-01-27 09:47:12 +00:00
|
|
|
extern crate maud;
|
2018-01-27 01:01:17 +00:00
|
|
|
extern crate route_recognizer;
|
2018-01-26 12:15:53 +00:00
|
|
|
extern crate semver;
|
2018-01-26 03:37:46 +00:00
|
|
|
#[macro_use] extern crate serde_derive;
|
|
|
|
extern crate serde;
|
|
|
|
extern crate serde_json;
|
|
|
|
#[macro_use] extern crate slog;
|
|
|
|
extern crate slog_json;
|
|
|
|
extern crate tokio_core;
|
|
|
|
extern crate tokio_service;
|
2018-01-26 12:15:53 +00:00
|
|
|
extern crate toml;
|
2018-01-26 03:37:46 +00:00
|
|
|
|
|
|
|
mod models;
|
2018-01-26 12:15:53 +00:00
|
|
|
mod parsers;
|
|
|
|
mod interactors;
|
|
|
|
mod engine;
|
2018-01-27 09:47:12 +00:00
|
|
|
mod server;
|
2018-01-26 03:37:46 +00:00
|
|
|
|
|
|
|
use std::net::SocketAddr;
|
|
|
|
use std::sync::Mutex;
|
|
|
|
|
|
|
|
use futures::{Future, Stream};
|
|
|
|
use hyper::Client;
|
|
|
|
use hyper::server::Http;
|
|
|
|
use hyper_tls::HttpsConnector;
|
|
|
|
use slog::Drain;
|
|
|
|
use tokio_core::reactor::Core;
|
|
|
|
|
2018-01-27 09:47:12 +00:00
|
|
|
use self::server::Server;
|
2018-01-26 12:15:53 +00:00
|
|
|
use self::engine::Engine;
|
2018-01-26 03:37:46 +00:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let logger = slog::Logger::root(
|
|
|
|
Mutex::new(slog_json::Json::default(std::io::stderr())).map(slog::Fuse),
|
|
|
|
o!("version" => env!("CARGO_PKG_VERSION"))
|
|
|
|
);
|
|
|
|
|
|
|
|
let mut core = Core::new()
|
|
|
|
.expect("failed to create event loop");
|
|
|
|
|
|
|
|
let handle = core.handle();
|
|
|
|
|
|
|
|
let connector = HttpsConnector::new(4, &handle)
|
|
|
|
.expect("failed to create https connector");
|
|
|
|
|
|
|
|
let client = Client::configure()
|
|
|
|
.connector(connector)
|
|
|
|
.build(&core.handle());
|
|
|
|
|
|
|
|
let addr = "0.0.0.0:8080".parse::<SocketAddr>()
|
|
|
|
.expect("failed to parse socket addr");
|
|
|
|
|
|
|
|
let http = Http::new();
|
|
|
|
|
2018-01-26 12:15:53 +00:00
|
|
|
let engine = Engine {
|
|
|
|
client: client.clone(),
|
|
|
|
logger: logger.clone()
|
|
|
|
};
|
|
|
|
|
2018-01-27 09:47:12 +00:00
|
|
|
let server = Server::new(engine);
|
2018-01-27 01:01:17 +00:00
|
|
|
|
2018-01-27 09:47:12 +00:00
|
|
|
let serve = http.serve_addr_handle(&addr, &handle, move || Ok(server.clone()))
|
2018-01-27 01:01:17 +00:00
|
|
|
.expect("failed to bind server");
|
2018-01-26 03:37:46 +00:00
|
|
|
|
|
|
|
let serving = serve.for_each(move |conn| {
|
|
|
|
let conn_logger = logger.clone();
|
|
|
|
handle.spawn(conn.then(move |res| {
|
|
|
|
if let Err(err) = res {
|
|
|
|
info!(conn_logger, "server connection error: {}", err)
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}));
|
|
|
|
Ok(())
|
|
|
|
});
|
|
|
|
|
|
|
|
core.run(serving).expect("server failed");
|
|
|
|
}
|