From 881e4bf3c9141b4bebaefaf6385652ed46d9a9fe Mon Sep 17 00:00:00 2001 From: "Adam T. Carpenter" Date: Wed, 7 Apr 2021 18:54:22 -0400 Subject: added some demo login template, functionality, also added basic kv store test and ui demo --- src/error.rs | 25 +++++++++++++++ src/handlers/mod.rs | 1 + src/main.rs | 7 +++-- src/models/mod.rs | 31 ++++++++++--------- src/repo/constants.rs | 11 +++++++ src/repo/mod.rs | 80 ++++++++++++++++++++++++++++++++++++++++++++++++ src/templates/login.html | 6 ++++ 7 files changed, 145 insertions(+), 16 deletions(-) create mode 100644 src/error.rs create mode 100644 src/repo/constants.rs create mode 100644 src/repo/mod.rs create mode 100644 src/templates/login.html (limited to 'src') diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..06d7d1e --- /dev/null +++ b/src/error.rs @@ -0,0 +1,25 @@ +use bincode::Error as bincode_e; +use sled::Error as sled_e; + +#[derive(Debug)] +pub struct TwinHError; + +impl std::error::Error for TwinHError {} + +impl std::fmt::Display for TwinHError { + fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> { + todo!() + } +} + +impl From for TwinHError { + fn from(_: sled_e) -> Self { + todo!() + } +} + +impl From for TwinHError { + fn from(_: bincode_e) -> Self { + todo!() + } +} diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 1aba908..3ad7f49 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -5,6 +5,7 @@ use hyper::Method; use hyper::StatusCode; use hyper::{Body, Request, Response}; use serde::{Deserialize, Serialize}; +use sled::Db; use std::convert::Infallible; // TODO: pub async fn router(req: Request) -> Result, Infallible> { diff --git a/src/main.rs b/src/main.rs index 168a5f5..1947ff8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,16 +5,19 @@ use hyper::{ use std::convert::Infallible; // TODO: mod config; +mod error; mod handlers; mod models; +mod repo; mod templates; #[tokio::main] async fn main() -> Result<(), Box> { let addr = config::INSTANCE.addr; - let make_svc = - make_service_fn(move |_conn| async { Ok::<_, Infallible>(service_fn(handlers::router)) }); + let make_svc = make_service_fn(move |_conn| async { + Ok::<_, Infallible>(service_fn(|req| handlers::router(req))) + }); let server = Server::bind(&addr).serve(make_svc); let graceful = server.with_graceful_shutdown(shutdown_signal()); diff --git a/src/models/mod.rs b/src/models/mod.rs index 5830a1b..a252f51 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1,27 +1,30 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] -pub struct Car { - doors: u8, - engine: Engine, - make: String, - model: String, - transmission: Transmission, - trim: String, - year: u16, // I'll worry about this in 65534 AD. +pub struct Part { + pub key: u64, + pub number: String, + pub name: String, + pub sources: Vec, + pub categories: Vec, + pub fits_cars: Vec, } #[derive(Serialize, Deserialize)] -pub struct Part { - name: String, - compatible_cars: Vec, - sources: Vec, - categories: Vec, +pub struct Car { + pub key: u64, + pub doors: u8, + //pub engine: Engine, + pub make: String, + pub model: String, + //pub transmission: Transmission, + pub trim: String, + pub year: u16, } #[derive(Serialize, Deserialize)] pub enum Source { - Uri(String), + Web(String), } #[derive(Serialize, Deserialize)] diff --git a/src/repo/constants.rs b/src/repo/constants.rs new file mode 100644 index 0000000..e168a77 --- /dev/null +++ b/src/repo/constants.rs @@ -0,0 +1,11 @@ +use once_cell::sync::Lazy; +use sled::{Config, Db}; + +pub const PARTS_TREE: &str = "parts"; +pub const CARS_TREE: &str = "cars"; +pub static REPO_INSTANCE: Lazy = Lazy::new(|| { + Config::default() + .path("/tmp/twinh") + .open() + .expect("Couldn't open DB!") +}); diff --git a/src/repo/mod.rs b/src/repo/mod.rs new file mode 100644 index 0000000..d4c5e44 --- /dev/null +++ b/src/repo/mod.rs @@ -0,0 +1,80 @@ +use crate::error::TwinHError; +use crate::models::Car; +use crate::models::Part; +use bincode::deserialize; +use constants::*; + +mod constants; + +pub fn create_new_db() -> Result<(), TwinHError> { + let config = sled::Config::default() + .path("/var/db/twinh") + .create_new(true); + let db = config.open()?; + Ok(()) +} + +pub fn get_all_cars() -> Result, TwinHError> { + let cars = REPO_INSTANCE + .open_tree(CARS_TREE)? + .into_iter() + .values() + .collect::, _>>()? + .iter() + .map(|c| deserialize::(&c)) + .collect::, _>>()?; + Ok(cars) +} + +pub fn insert_part(part: Part) -> Result { + todo!() +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::{Car, Part}; + use bincode::serialize; + use std::error::Error; + + #[test] + fn test_insert_part() -> Result<(), Box> { + let db = sled::Config::default() + .mode(sled::Mode::HighThroughput) + .temporary(true) + .open()?; + + let car = Car { + key: 1, + make: "Hudson".into(), + model: "Hornet".into(), + trim: "Sedan".into(), + doors: 4, + year: 1953, + }; + + let tree = db.open_tree(CARS_TREE)?; + let key = car.key.to_be_bytes(); + let val = serialize(&car)?; + tree.insert(key, val)?; + + let part = Part { + key: 2, + number: "ABC123".into(), + name: "Rear Wheel Bearing".into(), + fits_cars: vec![car.key], + categories: Vec::new(), + sources: Vec::new(), + }; + + let tree = db.open_tree(PARTS_TREE)?; + let (key, val) = (serialize(&part.key)?, serialize(&part)?); + tree.insert(key.clone(), val)?; + + let part_out = tree.get(key)?; + let part_out = deserialize::(&part_out.unwrap())?; + assert_eq!(part.key, part_out.key); + + Ok(()) + } +} diff --git a/src/templates/login.html b/src/templates/login.html new file mode 100644 index 0000000..9329a22 --- /dev/null +++ b/src/templates/login.html @@ -0,0 +1,6 @@ + + + + Login with Google + + -- cgit v1.2.3