use logicmap::{Brick, Card, Config, ExpResult, Statement};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Cat {
pub name: String,
pub hair_color: String,
}
#[derive(Debug)]
pub struct HairColorMatch {
pub color: String,
}
pub fn hair_color_match(target_hair_color: String) -> Box<dyn Fn(Cat) -> ExpResult + 'static> {
Box::new(move |input: Cat| {
ExpResult {
descr: format!("Hair is target color - {}", target_hair_color), path: vec![String::from("hair_color")], index: vec![], met_flag: input.hair_color == target_hair_color, }
})
}
impl Config<Cat> for HairColorMatch {
fn expression_function(&self) -> Box<dyn Fn(Cat) -> ExpResult + 'static> {
hair_color_match(self.color.clone())
}
fn name(&self) -> String {
format!("{:?}", self)
}
}
fn main() {
let matching_expression = Box::new(HairColorMatch {
color: String::from("tabby"),
});
println!("{:#?}", matching_expression);
let kitty: Cat = Cat {
name: String::from("Jameo"),
hair_color: String::from("black"),
};
let card: Card<Cat> = Card {
statements: vec![
Statement {
title: String::from("It's the perfect cat"),
contents: vec![
Brick {
title: String::from("cat hair color check"),
input: kitty.clone(), expcheck: matching_expression.expression_function(),
},
],
},
],
};
let report = card.report();
println!("{:#?}", kitty);
println!("{:#?}", report);
let kitty2: Cat = Cat {
name: String::from("Biggie"),
hair_color: String::from("tabby"),
};
let card2: Card<Cat> = Card {
statements: vec![
Statement {
title: String::from("It's the perfect cat"),
contents: vec![
Brick {
title: String::from("cat hair color check"),
input: kitty2.clone(), expcheck: matching_expression.expression_function(),
},
],
},
],
};
let report2 = card2.report();
println!("{:#?}", kitty2);
println!("{:#?}", report2);
}