From 39808b8bda5749acbaaf38b9f6a7d974deb4577a Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Mon, 9 May 2022 17:52:22 +0300 Subject: [PATCH] api: add all ingredients resolver --- Cargo.lock | 20 +++++++++++++++ api/Cargo.toml | 3 +++ api/src/domain/ingredient/fetch_list.rs | 6 +++++ api/src/domain/ingredient/mod.rs | 2 ++ api/src/domain/ingredient/types.rs | 12 +++++++++ api/src/domain/mod.rs | 1 + api/src/main.rs | 34 +++++++------------------ api/src/repo/ingredient.rs | 13 ++++++++++ api/src/repo/mod.rs | 1 + api/src/server.rs | 31 ++++++++++++++++++++++ db/src/lib.rs | 2 +- 11 files changed, 99 insertions(+), 26 deletions(-) create mode 100644 api/src/domain/ingredient/fetch_list.rs create mode 100644 api/src/domain/ingredient/mod.rs create mode 100644 api/src/domain/ingredient/types.rs create mode 100644 api/src/domain/mod.rs create mode 100644 api/src/repo/ingredient.rs create mode 100644 api/src/repo/mod.rs create mode 100644 api/src/server.rs diff --git a/Cargo.lock b/Cargo.lock index d3c28be..17609f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,9 @@ version = 3 name = "api" version = "0.1.0" dependencies = [ + "db", + "serde", + "serde_json", "tiny_http", ] @@ -123,6 +126,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + [[package]] name = "serde" version = "1.0.137" @@ -143,6 +152,17 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "syn" version = "1.0.92" diff --git a/api/Cargo.toml b/api/Cargo.toml index 86a04f5..a26d0c2 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -6,4 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +db = { version = "0.1.0", path = "../db" } +serde = { version = "1.0.137", features = ["derive"] } +serde_json = "1.0.81" tiny_http = "0.11.0" diff --git a/api/src/domain/ingredient/fetch_list.rs b/api/src/domain/ingredient/fetch_list.rs new file mode 100644 index 0000000..540d283 --- /dev/null +++ b/api/src/domain/ingredient/fetch_list.rs @@ -0,0 +1,6 @@ +use super::types; +use crate::repo::ingredient::IngredientRepo; + +pub fn execute(repo: impl IngredientRepo) -> Vec { + repo.get_ingredients() +} diff --git a/api/src/domain/ingredient/mod.rs b/api/src/domain/ingredient/mod.rs new file mode 100644 index 0000000..1f3c4a4 --- /dev/null +++ b/api/src/domain/ingredient/mod.rs @@ -0,0 +1,2 @@ +pub mod fetch_list; +pub mod types; diff --git a/api/src/domain/ingredient/types.rs b/api/src/domain/ingredient/types.rs new file mode 100644 index 0000000..eee626e --- /dev/null +++ b/api/src/domain/ingredient/types.rs @@ -0,0 +1,12 @@ +#[derive(Debug, Serialize)] +pub struct Ingredient { + key: String, +} + +impl From<&db::data::Ingredient> for Ingredient { + fn from(db: &db::data::Ingredient) -> Self { + Self { + key: db.key.to_string(), + } + } +} diff --git a/api/src/domain/mod.rs b/api/src/domain/mod.rs new file mode 100644 index 0000000..ac67972 --- /dev/null +++ b/api/src/domain/mod.rs @@ -0,0 +1 @@ +pub mod ingredient; diff --git a/api/src/main.rs b/api/src/main.rs index bff60b8..b71c700 100644 --- a/api/src/main.rs +++ b/api/src/main.rs @@ -1,28 +1,12 @@ -use std::sync::Arc; -use std::thread; +#![deny(clippy::all)] + +#[macro_use] +extern crate serde; + +mod domain; +mod repo; +mod server; fn main() { - start_server(); -} - -fn start_server() { - let server = Arc::new(tiny_http::Server::http("0.0.0.0:33333").unwrap()); - println!("Server listening on port 33333"); - - let mut handles = Vec::with_capacity(4); - - for _ in 0..4 { - let server = server.clone(); - - handles.push(thread::spawn(move || { - for rq in server.incoming_requests() { - let response = tiny_http::Response::from_string("hello world".to_string()); - let _ = rq.respond(response); - } - })); - } - - for h in handles { - h.join().unwrap(); - } + server::start(); } diff --git a/api/src/repo/ingredient.rs b/api/src/repo/ingredient.rs new file mode 100644 index 0000000..54451f1 --- /dev/null +++ b/api/src/repo/ingredient.rs @@ -0,0 +1,13 @@ +use crate::domain::ingredient::types; + +pub trait IngredientRepo { + fn get_ingredients(&self) -> Vec; +} + +pub struct StaticIngredientRepo {} + +impl IngredientRepo for StaticIngredientRepo { + fn get_ingredients(&self) -> Vec { + db::INGREDIENTS.iter().map(From::from).collect::>() + } +} diff --git a/api/src/repo/mod.rs b/api/src/repo/mod.rs new file mode 100644 index 0000000..ac67972 --- /dev/null +++ b/api/src/repo/mod.rs @@ -0,0 +1 @@ +pub mod ingredient; diff --git a/api/src/server.rs b/api/src/server.rs new file mode 100644 index 0000000..df36862 --- /dev/null +++ b/api/src/server.rs @@ -0,0 +1,31 @@ +use std::sync::Arc; +use std::thread; + +use crate::domain; +use crate::repo::ingredient::StaticIngredientRepo; + +pub fn start() { + let server = Arc::new(tiny_http::Server::http("0.0.0.0:33333").unwrap()); + println!("Server listening on port 33333"); + + let mut handles = Vec::with_capacity(4); + + for _ in 0..4 { + let server = server.clone(); + + handles.push(thread::spawn(move || { + for rq in server.incoming_requests() { + let repo = StaticIngredientRepo {}; + let ingredients = domain::ingredient::fetch_list::execute(repo); + let data = serde_json::to_string(&ingredients).unwrap(); + + let response = tiny_http::Response::from_string(data); + let _ = rq.respond(response); + } + })); + } + + for h in handles { + h.join().unwrap(); + } +} diff --git a/db/src/lib.rs b/db/src/lib.rs index 0cb1fd4..0a8b6dd 100644 --- a/db/src/lib.rs +++ b/db/src/lib.rs @@ -1,3 +1,3 @@ -mod data; +pub mod data; pub use data::{INGREDIENTS, RECIPES};