diff --git a/bayard-rest/src/lib.rs b/bayard-rest/src/lib.rs index 062ae9d..b426e54 100644 --- a/bayard-rest/src/lib.rs +++ b/bayard-rest/src/lib.rs @@ -1 +1,2 @@ pub mod handler; +pub mod rest; diff --git a/bayard-rest/src/main.rs b/bayard-rest/src/main.rs index e31ad49..8c375fb 100644 --- a/bayard-rest/src/main.rs +++ b/bayard-rest/src/main.rs @@ -3,27 +3,11 @@ extern crate clap; use clap::{App, AppSettings, Arg}; use crossbeam_channel::select; -use iron::{Chain, Iron}; use log::*; -use logger::Logger; -use persistent::Write; -use router::Router; -use bayard_client::index::client::IndexClient; use bayard_common::log::set_logger; use bayard_common::signal::sigterm_channel; -use bayard_rest::handler::bulk_delete::bulk_delete; -use bayard_rest::handler::bulk_set::bulk_set; -use bayard_rest::handler::commit::commit; -use bayard_rest::handler::delete::delete; -use bayard_rest::handler::get::get; -use bayard_rest::handler::merge::merge; -use bayard_rest::handler::rollback::rollback; -use bayard_rest::handler::schema::schema; -use bayard_rest::handler::search::search; -use bayard_rest::handler::set::set; -use bayard_rest::handler::status::status; -use bayard_rest::handler::Client; +use bayard_rest::rest::server::RestServer; fn main() -> Result<(), std::io::Error> { set_logger(); @@ -70,29 +54,7 @@ fn main() -> Result<(), std::io::Error> { let port = matches.value_of("PORT").unwrap().parse::().unwrap(); let server = matches.value_of("SERVER").unwrap(); - let index_client = IndexClient::new(server); - - let (logger_before, logger_after) = Logger::new(None); - let mut router = Router::new(); - router.get("/v1/documents/:id", get, "get"); - router.put("/v1/documents/:id", set, "set"); - router.delete("/v1/documents/:id", delete, "delete"); - router.put("/v1/documents", bulk_set, "bulk_set"); - router.delete("/v1/documents", bulk_delete, "bulk_delete"); - router.get("/v1/commit", commit, "commit"); - router.get("/v1/rollback", rollback, "rollback"); - router.get("/v1/merge", merge, "merge"); - router.get("/v1/schema", schema, "schema"); - router.post("/v1/search", search, "search"); - router.get("/v1/status", status, "status"); - - let mut chain = Chain::new(router); - chain.link_before(logger_before); - chain.link(Write::::both(index_client)); - chain.link_after(logger_after); - - let mut rest_server = Iron::new(chain).http(format!("{}:{}", host, port)).unwrap(); - info!("start rest service on {}:{}", host, port); + let mut rest_server = RestServer::new(format!("{}:{}", host, port).as_str(), server); // Wait for signals for termination (SIGINT, SIGTERM). let sigterm_receiver = sigterm_channel().unwrap(); @@ -105,14 +67,8 @@ fn main() -> Result<(), std::io::Error> { } } - match rest_server.close() { - Ok(_) => { - info!("stop metrics service on {}:{}", host, port); - } - Err(e) => error!("{}", e), + match rest_server.shutdown() { + Ok(_) => Ok(()), + Err(e) => Err(e), } - - info!("exit"); - - Ok(()) } diff --git a/bayard-rest/src/rest/mod.rs b/bayard-rest/src/rest/mod.rs new file mode 100644 index 0000000..74f47ad --- /dev/null +++ b/bayard-rest/src/rest/mod.rs @@ -0,0 +1 @@ +pub mod server; diff --git a/bayard-rest/src/rest/server.rs b/bayard-rest/src/rest/server.rs new file mode 100644 index 0000000..05d3877 --- /dev/null +++ b/bayard-rest/src/rest/server.rs @@ -0,0 +1,76 @@ +use std::io::{Error, ErrorKind}; + +use iron::{Chain, Iron, Listening}; +use log::*; +use logger::Logger; +use persistent::Write; +use router::Router; + +use bayard_client::index::client::IndexClient; + +use crate::handler::bulk_delete::bulk_delete; +use crate::handler::bulk_set::bulk_set; +use crate::handler::commit::commit; +use crate::handler::delete::delete; +use crate::handler::get::get; +use crate::handler::merge::merge; +use crate::handler::rollback::rollback; +use crate::handler::schema::schema; +use crate::handler::search::search; +use crate::handler::set::set; +use crate::handler::status::status; +use crate::handler::Client; + +pub struct RestServer { + address: String, + listening: Listening, +} + +impl RestServer { + pub fn new(address: &str, server: &str) -> RestServer { + let index_client = IndexClient::new(server); + + let (logger_before, logger_after) = Logger::new(None); + let mut router = Router::new(); + router.get("/v1/documents/:id", get, "get"); + router.put("/v1/documents/:id", set, "set"); + router.delete("/v1/documents/:id", delete, "delete"); + router.put("/v1/documents", bulk_set, "bulk_set"); + router.delete("/v1/documents", bulk_delete, "bulk_delete"); + router.get("/v1/commit", commit, "commit"); + router.get("/v1/rollback", rollback, "rollback"); + router.get("/v1/merge", merge, "merge"); + router.get("/v1/schema", schema, "schema"); + router.post("/v1/search", search, "search"); + router.get("/v1/status", status, "status"); + + let mut chain = Chain::new(router); + chain.link_before(logger_before); + chain.link(Write::::both(index_client)); + chain.link_after(logger_after); + + let listening = Iron::new(chain).http(address).unwrap(); + info!("start rest service on {}", address); + + RestServer { + address: address.to_string(), + listening, + } + } + + pub fn shutdown(&mut self) -> Result<(), std::io::Error> { + match self.listening.close() { + Ok(_) => { + info!("stop rest service on {}", self.address); + Ok(()) + } + Err(e) => { + error!( + "failed stop rest service on {}: error={:?}", + self.address, e + ); + Err(Error::new(ErrorKind::Other, e)) + } + } + } +}