Adds pretty_output
This commit is contained in:
@@ -5,7 +5,6 @@ extern crate dotenv;
|
|||||||
pub mod schema;
|
pub mod schema;
|
||||||
pub mod models;
|
pub mod models;
|
||||||
|
|
||||||
mod recipe;
|
|
||||||
mod importer;
|
mod importer;
|
||||||
|
|
||||||
use diesel::prelude::*;
|
use diesel::prelude::*;
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
|
|
||||||
/// Tag associated with ingredients
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub enum FoodTag {
|
|
||||||
Viande,
|
|
||||||
Poisson,
|
|
||||||
Legume,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Categories for recipe, to organize them for navigation and planning
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub enum RecipeCategory {
|
|
||||||
PetitDejeuner,
|
|
||||||
Entree,
|
|
||||||
Plat,
|
|
||||||
Dessert,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A collection of tags, to be improved
|
|
||||||
type FoodTags = Vec<FoodTag>;
|
|
||||||
|
|
||||||
/// Nutritionnal values per 100g, to be improved
|
|
||||||
#[derive(Default)]
|
|
||||||
struct NutritionnalValues;
|
|
||||||
|
|
||||||
/// An individual ingredient
|
|
||||||
#[derive(Default)]
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub struct Ingredient {
|
|
||||||
/// All known alias of a same ingredient
|
|
||||||
alias: Vec<String>,
|
|
||||||
/// Nutrionnal values per 100g
|
|
||||||
nutrition: NutritionnalValues,
|
|
||||||
/// Associated tags to constraint planning
|
|
||||||
tags: FoodTags,
|
|
||||||
}
|
|
||||||
@@ -12,6 +12,7 @@ use self::planner::solver::{Variables, Domain, Problem, Constraint};
|
|||||||
/// Lunch => RecipeCategory::MainCourse
|
/// Lunch => RecipeCategory::MainCourse
|
||||||
/// Dinner => RecipeCategory::MainCourse
|
/// Dinner => RecipeCategory::MainCourse
|
||||||
type Day = String;
|
type Day = String;
|
||||||
|
const DAYS: &[&str] = &["Lundi", "Mardi", "Mercredi"];
|
||||||
|
|
||||||
enum Meals {
|
enum Meals {
|
||||||
Breakfast(Day),
|
Breakfast(Day),
|
||||||
@@ -36,7 +37,7 @@ enum RecipeCategory {
|
|||||||
/// It may also contains an initial value for each variable
|
/// It may also contains an initial value for each variable
|
||||||
fn generate_variables<V>(domain: &Domain<V>) -> Vec<(String, &Domain<V>, Option<&V>)> {
|
fn generate_variables<V>(domain: &Domain<V>) -> Vec<(String, &Domain<V>, Option<&V>)> {
|
||||||
let mut vars = Vec::new();
|
let mut vars = Vec::new();
|
||||||
for day in &["Lundi", "Mardi", "Mercredi"] {
|
for day in DAYS {
|
||||||
vars.push((Meals::Lunch(day.to_string()).into(), domain, None));
|
vars.push((Meals::Lunch(day.to_string()).into(), domain, None));
|
||||||
vars.push((Meals::Dinner(day.to_string()).into(), domain, None));
|
vars.push((Meals::Dinner(day.to_string()).into(), domain, None));
|
||||||
}
|
}
|
||||||
@@ -48,6 +49,19 @@ fn ingredients_contains<'a>(assign: &Variables<'a,Recipe>) -> bool {
|
|||||||
&& !assign.get("Mardi_Lunch").unwrap().unwrap().ingredients.contains("Patates")
|
&& !assign.get("Mardi_Lunch").unwrap().unwrap().ingredients.contains("Patates")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn pretty_output(res: &Variables<Recipe>) -> String {
|
||||||
|
let mut repr = String::new();
|
||||||
|
for (var,value) in res {
|
||||||
|
let value = match value {
|
||||||
|
Some(rec) => &rec.title,
|
||||||
|
None => "---",
|
||||||
|
};
|
||||||
|
repr.push_str(&format!("{} => {}\n", var, value));
|
||||||
|
}
|
||||||
|
repr
|
||||||
|
}
|
||||||
|
|
||||||
fn get_planning_all_results() -> String {
|
fn get_planning_all_results() -> String {
|
||||||
let conn = establish_connection();
|
let conn = establish_connection();
|
||||||
let possible_values = recipes::load_all(&conn);
|
let possible_values = recipes::load_all(&conn);
|
||||||
@@ -56,10 +70,13 @@ fn get_planning_all_results() -> String {
|
|||||||
for (var, dom, ini) in generate_variables(&domain) {
|
for (var, dom, ini) in generate_variables(&domain) {
|
||||||
problem = problem.add_variable(var, dom, ini);
|
problem = problem.add_variable(var, dom, ini);
|
||||||
}
|
}
|
||||||
let mut problem = problem.add_constraint(ingredients_contains)
|
let mut problem = problem
|
||||||
.finish();
|
.add_constraint(
|
||||||
|
ingredients_contains
|
||||||
|
)
|
||||||
|
.finish();
|
||||||
let results = problem.solve_all();
|
let results = problem.solve_all();
|
||||||
format!("{:#?}\nTotal = {}", &results.first(), results.len())
|
format!("{}\nTotal = {}", pretty_output(&results.first().unwrap()), results.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user