diff --git a/cookbook/db.sqlite3 b/cookbook/db.sqlite3 index c67a2ba..e4e6f14 100644 Binary files a/cookbook/db.sqlite3 and b/cookbook/db.sqlite3 differ diff --git a/cookbook/src/bin/write_recipe.rs b/cookbook/src/bin/write_recipe.rs index 49788ae..998bd5e 100644 --- a/cookbook/src/bin/write_recipe.rs +++ b/cookbook/src/bin/write_recipe.rs @@ -25,10 +25,18 @@ impl<'a> CreateRecipe<'a> { self.title = title; } - fn add_ingredient(&mut self, ingredient: String) { - // TODO: Validate ingredient - self.ingredients.push_str(&ingredient); - println!("+"); + fn add_ingredient(&mut self, name: String) { + use crate::ingredients::*; + + // Check it exists or create + if let Some(ingdt) = find(self.connection, &name) { + println!("="); + } else { + create(self.connection, &name); + println!("+{}", &name); + } + + self.ingredients.push_str(&name); } fn insert(self) { diff --git a/cookbook/src/lib.rs b/cookbook/src/lib.rs index 60380c0..e822d74 100644 --- a/cookbook/src/lib.rs +++ b/cookbook/src/lib.rs @@ -6,13 +6,12 @@ pub mod schema; pub mod models; mod recipe; -mod storage; mod importer; use diesel::prelude::*; use dotenv::dotenv; use std::env; -use crate::models::{Recipe, NewRecipe, Ingredient, NewIngredient}; +use crate::models::{Recipe, NewRecipe}; pub fn establish_connection() -> SqliteConnection { dotenv().ok(); @@ -39,11 +38,37 @@ pub fn create_recipe(conn: &SqliteConnection, title: &str, ingdts: &str) -> usiz } -pub fn find_ingredient(conn: &SqliteConnection, alias: &str) -> Option { - // Find ingredient by alias - None +pub mod ingredients { + use crate::models::{Ingredient, NewIngredient}; + use super::{SqliteConnection, schema}; + use super::diesel::prelude::*; + + pub fn find(conn: &SqliteConnection, name: &str) -> Option { + use self::schema::ingredients::dsl::*; + + let results = ingredients.filter(alias.like(name)) + .limit(1) + .load::(conn) + .expect("Error finding ingredient"); + + if !results.is_empty() { + Some(results.into_iter().nth(0).unwrap()) + } else { + None + } + } + + pub fn create(conn: &SqliteConnection, name: &str) -> usize { + use self::schema::ingredients; + + diesel::insert_into(ingredients::table) + .values(&NewIngredient { alias: name }) + .execute(conn) + .expect("Error inserting ingredient") + } } + #[cfg(test)] mod tests { #[test] diff --git a/cookbook/src/recipe.rs b/cookbook/src/recipe.rs index 9076fe5..1ecc7c5 100644 --- a/cookbook/src/recipe.rs +++ b/cookbook/src/recipe.rs @@ -34,23 +34,3 @@ pub struct Ingredient { /// Associated tags to constraint planning tags: FoodTags, } - -impl Ingredient { - /// Builds a brand new ingredient with given name as first alias - pub(super) fn new(name: String) -> Ingredient { - Ingredient { - alias: vec![name], - ..Default::default() - } - } - - /// Find an existing ingredient by alias - pub fn find(alias: &str) -> Option { - None - } - - /// Get the ingredient most common name - pub fn name(&self) -> &str { - self.alias.first().expect("Ingredient without any name !") - } -} diff --git a/cookbook/src/storage.rs b/cookbook/src/storage.rs deleted file mode 100644 index 2b6bbb0..0000000 --- a/cookbook/src/storage.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! Storage backend for persistent data -//! -//! Data is stored in a sqlite file. -//! We'll try to use Diesel-rs, but not ready yet to grasp it all.