From 18290b45af404af505936cd850762057a5a4eea0 Mon Sep 17 00:00:00 2001 From: "Adam T. Carpenter" Date: Fri, 5 Mar 2021 16:48:48 -0500 Subject: broke out handlers, added basic models --- src/handlers/mod.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/handlers/mod.rs (limited to 'src/handlers') diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs new file mode 100644 index 0000000..efd99f5 --- /dev/null +++ b/src/handlers/mod.rs @@ -0,0 +1,70 @@ +use crate::templates; +use handlebars::Handlebars; +use hyper::Method; +use hyper::StatusCode; +use hyper::{Body, Request, Response}; +use serde::{Deserialize, Serialize}; +use std::convert::Infallible; // TODO: + +pub async fn router( + req: Request, + _client: mongodb::Client, +) -> Result, 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") => get_parts(req).await, + _ => Ok(Response::builder() + .status(StatusCode::NOT_FOUND) + .body("Not found.".into()) + .unwrap()), + } +} + +async fn get_parts(req: Request) -> Result, Infallible> { + let query = req.uri().query().unwrap_or_default(); + let filter = serde_urlencoded::de::from_str::(query).unwrap(); + let mut reg = Handlebars::new(); + reg.register_template_string("index", templates::INDEX_T) + .unwrap(); + 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") { + data.models = Some(vec!["Hornet".into(), "Wasp".into(), "Jet".into()]); + } else if make.eq("Essex") { + data.models = Some(vec!["Super Six".into()]); + } + data.selected_make = Some(make); + } + + data.parts = Some(Vec::new()); + if let Some(model) = filter.model { + data.parts = Some(vec!["1".into(), "2".into(), "3".into()]); + data.selected_model = Some(model); + } + + let result = reg.render("index", &data).unwrap(); + Ok(Response::new(result.into())) +} + +#[derive(Debug, Deserialize)] +struct PartsQuery { + make: Option, + year: Option, + model: Option, + engine: Option, +} + +#[derive(Debug, Serialize, Default)] +struct PartsData { + makes: Option>, + years: Option>, + models: Option>, + engines: Option>, + selected_make: Option, + selected_year: Option, + selected_model: Option, + selected_engine: Option, + parts: Option>, +} -- cgit v1.2.3