diff --git a/cookbook/db.sqlite3 b/cookbook/db.sqlite3 index 32548bf..6157cfa 100644 Binary files a/cookbook/db.sqlite3 and b/cookbook/db.sqlite3 differ diff --git a/cookbook/src/bin/show_recipes.rs b/cookbook/src/bin/show_recipes.rs index 2d86407..2d25df1 100644 --- a/cookbook/src/bin/show_recipes.rs +++ b/cookbook/src/bin/show_recipes.rs @@ -10,7 +10,6 @@ fn main() { let conn = establish_connection(); let result = recipes - .limit(5) .load::(&conn) .expect("Error loading recipes"); diff --git a/cookbook/src/lib.rs b/cookbook/src/lib.rs index a614405..1a9b7cc 100644 --- a/cookbook/src/lib.rs +++ b/cookbook/src/lib.rs @@ -21,6 +21,18 @@ pub fn establish_connection() -> SqliteConnection { .expect(&format!("Error connecting to {}", db_url)) } +pub mod recipes { + use crate::models::{Recipe, NewRecipe}; + use super::{SqliteConnection, schema}; + use super::diesel::prelude::*; + + pub fn load_all(conn: &SqliteConnection) -> Vec { + use self::schema::recipes::dsl::*; + recipes.load::(conn) + .expect("Error loading recipe's list") + } +} + pub mod ingredients { use crate::models::{Ingredient, NewIngredient}; diff --git a/cookbook/src/models.rs b/cookbook/src/models.rs index f120216..dcfa9e9 100644 --- a/cookbook/src/models.rs +++ b/cookbook/src/models.rs @@ -2,7 +2,7 @@ use super::schema::recipes; use super::schema::ingredients; use super::diesel::prelude::*; -#[derive(Queryable)] +#[derive(Debug, Clone, Queryable)] pub struct Recipe { pub id: i32, pub title: String, diff --git a/planner/.env b/planner/.env new file mode 100644 index 0000000..96e052a --- /dev/null +++ b/planner/.env @@ -0,0 +1 @@ +DATABASE_URL=../cookbook/db.sqlite3 diff --git a/planner/src/bin/weekly.rs b/planner/src/bin/weekly.rs index 0ffea8f..22289d4 100644 --- a/planner/src/bin/weekly.rs +++ b/planner/src/bin/weekly.rs @@ -1,2 +1,33 @@ //! The weekly menu planner //! +extern crate cookbook; +extern crate planner; + +use self::cookbook::*; +use self::cookbook::models::Recipe; +use self::planner::solver::{Domain, Problem, Variables}; + +fn ingredients_contains<'a>(assign: &Variables<'a,Recipe>) -> bool { + assign.get("Lundi_midi").unwrap().unwrap().ingredients.contains("Patates") + && assign.get("Mardi_midi").unwrap().unwrap().ingredients.contains("Patates") +} + +fn get_planning_all_results() -> String { + let conn = establish_connection(); + let possible_values = recipes::load_all(&conn); + let domain = Domain::new(possible_values); + + let mut problem = Problem::build() + .add_variable("Lundi_midi".to_string(), &domain, None) + .add_variable("Mardi_midi".to_string(), &domain, None) + .add_constraint(ingredients_contains) + .finish(); + + let results = problem.solve_all(); + format!("{:#?}\nTotal = {}", &results, results.len()) +} + +fn main() { + + println!("{}", get_planning_all_results()); +}