summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs43
1 files changed, 30 insertions, 13 deletions
diff --git a/src/main.rs b/src/main.rs
index 2f5bdf4..b71df18 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -5,16 +5,22 @@ use hyper::StatusCode;
use hyper::{Body, Request, Response, Server};
use serde::{Deserialize, Serialize};
use std::convert::Infallible;
-use std::net::SocketAddr;
+mod config;
+mod models;
mod templates;
#[tokio::main]
-async fn main() {
- // bind to 127.0.0.1:3000
- let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
+async fn main() -> Result<(), Box<dyn std::error::Error>> {
+ let addr = config::INSTANCE.addr;
- let make_svc = make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(router)) });
+ let client = mongodb::Client::with_uri_str(&config::INSTANCE.db_uri).await?;
+
+ let make_svc = make_service_fn(move |_conn| {
+ let client = client.clone();
+
+ async { Ok::<_, Infallible>(service_fn(move |req| router(req, client.to_owned()))) }
+ });
let server = Server::bind(&addr).serve(make_svc);
let graceful = server.with_graceful_shutdown(shutdown_signal());
@@ -23,12 +29,17 @@ async fn main() {
if let Err(e) = graceful.await {
eprintln!("server error: {}", e);
}
+
+ Ok(())
}
-async fn router(req: Request<Body>) -> Result<Response<Body>, Infallible> {
+async fn router(
+ req: Request<Body>,
+ _client: mongodb::Client,
+) -> Result<Response<Body>, Infallible> {
match (req.method(), req.uri().path()) {
(&Method::GET, "/") | (&Method::GET, "/index.html") => Ok(Response::new("Welcome!".into())),
- (&Method::GET, "/parts") | (&Method::GET, "/parts/index.html") => parts(req).await,
+ (&Method::GET, "/parts") | (&Method::GET, "/parts/index.html") => get_parts(req).await,
_ => Ok(Response::builder()
.status(StatusCode::NOT_FOUND)
.body("Not found.".into())
@@ -36,14 +47,14 @@ async fn router(req: Request<Body>) -> Result<Response<Body>, Infallible> {
}
}
-async fn parts(req: Request<Body>) -> Result<Response<Body>, Infallible> {
+async fn get_parts(req: Request<Body>) -> Result<Response<Body>, Infallible> {
let query = req.uri().query().unwrap_or_default();
- let filter = serde_urlencoded::de::from_str::<PartsRequest>(query).unwrap();
+ let filter = serde_urlencoded::de::from_str::<PartsQuery>(query).unwrap();
let mut reg = Handlebars::new();
reg.register_template_string("index", templates::INDEX_T)
.unwrap();
- let mut data = PartsView::default();
- data.makes = Some(vec!["Hudson".into(), "Essex".into()]);
+ let mut data = PartsData::default();
+ data.makes = Some(vec!["Hudson".into(), "Essex".into(), "Terraplane".into()]);
if let Some(make) = filter.make {
if make.eq("Hudson") {
@@ -72,16 +83,22 @@ async fn shutdown_signal() {
}
#[derive(Debug, Deserialize)]
-struct PartsRequest {
+struct PartsQuery {
make: Option<String>,
+ year: Option<String>,
model: Option<String>,
+ engine: Option<String>,
}
#[derive(Debug, Serialize, Default)]
-struct PartsView {
+struct PartsData {
makes: Option<Vec<String>>,
+ years: Option<Vec<String>>,
models: Option<Vec<String>>,
+ engines: Option<Vec<String>>,
selected_make: Option<String>,
+ selected_year: Option<String>,
selected_model: Option<String>,
+ selected_engine: Option<String>,
parts: Option<Vec<String>>,
}