use crate::domain::ingredient::types; #[derive(Default)] pub struct GetIngredientOpts { pub lang: Option, } pub trait IngredientRepo { fn get_ingredients(&self, opts: GetIngredientOpts) -> Vec; } pub struct StaticIngredientRepo; impl IngredientRepo for StaticIngredientRepo { fn get_ingredients(&self, opts: GetIngredientOpts) -> Vec { let langs = [opts.lang.unwrap_or_default()].repeat(db::INGREDIENTS.len()); db::INGREDIENTS .iter() .zip(langs) .filter_map(|tup| TryFrom::try_from(tup).ok()) .collect::>() } } #[cfg(test)] pub struct InMemoryIngredientRepo { pub ingredients: Vec, } #[cfg(test)] impl InMemoryIngredientRepo { pub fn new() -> Self { Self { ingredients: vec![ db::data::Ingredient { key: "apple", translates: db::data::IngredientTranslate { ru: "Яблоко", en: Some("Apple"), }, }, db::data::Ingredient { key: "orange", translates: db::data::IngredientTranslate { ru: "Апельсин", en: None, }, }, db::data::Ingredient { key: "salt", translates: db::data::IngredientTranslate { ru: "Соль", en: Some("Salt"), }, }, db::data::Ingredient { key: "sugar", translates: db::data::IngredientTranslate { ru: "Сахар", en: None, }, }, ], } } } #[cfg(test)] impl IngredientRepo for InMemoryIngredientRepo { fn get_ingredients(&self, opts: GetIngredientOpts) -> Vec { let langs = [opts.lang.unwrap_or_default()].repeat(self.ingredients.len()); self.ingredients .iter() .zip(langs) .filter_map(|tup| TryFrom::try_from(tup).ok()) .collect::>() } }