From 5e92e30f51a812bb5ffce7df6a02cb5ec3e583e3 Mon Sep 17 00:00:00 2001 From: artus40 Date: Wed, 30 Jan 2019 14:21:37 +0100 Subject: [PATCH] Creates a simple planning --- cookbook/db.sqlite3 | Bin 20480 -> 20480 bytes cookbook/src/bin/show_recipes.rs | 1 - cookbook/src/lib.rs | 12 ++++++++++++ cookbook/src/models.rs | 2 +- planner/.env | 1 + planner/src/bin/weekly.rs | 31 +++++++++++++++++++++++++++++++ 6 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 planner/.env diff --git a/cookbook/db.sqlite3 b/cookbook/db.sqlite3 index 32548bfed1af21cacc5a4c488357f03e20a5187a..6157cfa126d02589a208d68578d065f000992a82 100644 GIT binary patch delta 134 zcmZozz}T>Wae_3X%tRSyMwyKXOZ0hI_zM~MAMx+!U&LRySx_L6-%y{0jX{;eoi`-0 zs3bEjC$*#`l{X-<(j<6K1qO$e***mC;sRB bH~G)2rG;0pO03RDOgEF$x1O5&Gg8V5M delta 63 zcmV-F0Kor%paFoO0gxL38j&1B0UEJjq%R5s5264M;t#(MqO%bYln;}lKVl9A55NEq V@(SRz_Sq`t`C#IPe6a(6=DDY 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()); +}