refac: fallback lang instead of filtering

This commit is contained in:
Dmitriy Pleshevskiy 2022-05-12 21:59:09 +03:00
parent e2ae40b685
commit 4626157319
3 changed files with 21 additions and 21 deletions

View File

@ -44,7 +44,7 @@ mod tests {
} }
#[test] #[test]
fn should_return_filtered_by_lang() { fn should_return_preferred_lang_with_fallback() {
let repo = crate::repo::ingredient::InMemoryIngredientRepo::new(); let repo = crate::repo::ingredient::InMemoryIngredientRepo::new();
let res = execute( let res = execute(
&repo, &repo,
@ -55,14 +55,22 @@ mod tests {
); );
match res.as_slice() { match res.as_slice() {
[apple, salt] => { [apple, orange, salt, sugar] => {
assert_eq!(apple.key, String::from("apple")); assert_eq!(apple.key, String::from("apple"));
assert_eq!(apple.lang, Lang::Eng); assert_eq!(apple.lang, Lang::Eng);
assert_eq!(apple.name, String::from("Apple")); assert_eq!(apple.name, String::from("Apple"));
assert_eq!(orange.key, String::from("orange"));
assert_eq!(orange.lang, Lang::Rus);
assert_eq!(orange.name, String::from("Апельсин"));
assert_eq!(salt.key, String::from("salt")); assert_eq!(salt.key, String::from("salt"));
assert_eq!(salt.lang, Lang::Eng); assert_eq!(salt.lang, Lang::Eng);
assert_eq!(salt.name, String::from("Salt")); assert_eq!(salt.name, String::from("Salt"));
assert_eq!(sugar.key, String::from("sugar"));
assert_eq!(sugar.lang, Lang::Rus);
assert_eq!(sugar.name, String::from("Сахар"));
} }
_ => unimplemented!(), _ => unimplemented!(),
} }

View File

@ -38,26 +38,18 @@ impl From<&db::data::Ingredient> for Ingredient {
} }
} }
#[derive(Debug)] impl From<(&db::data::Ingredient, Lang)> for Ingredient {
pub enum IngredientValidError { fn from((db, lang): (&db::data::Ingredient, Lang)) -> Self {
TranslationNotFound, let tr = &db.translates;
}
impl TryFrom<(&db::data::Ingredient, Lang)> for Ingredient {
type Error = IngredientValidError;
fn try_from((db, lang): (&db::data::Ingredient, Lang)) -> Result<Self, Self::Error> {
let key = db.key.to_string();
let name = match lang { let name = match lang {
Lang::Rus => Some(db.translates.ru), Lang::Rus => tr.ru,
Lang::Eng => db.translates.en, Lang::Eng => tr.en.unwrap_or(tr.ru),
}; };
if let Some(name) = name.map(String::from) { Self {
Ok(Self { key, lang, name }) key: db.key.to_string(),
} else { lang: if name == tr.ru { Lang::Rus } else { lang },
Err(IngredientValidError::TranslationNotFound) name: name.to_string(),
} }
} }
} }

View File

@ -27,7 +27,7 @@ impl IngredientRepo for StaticIngredientRepo {
db::INGREDIENTS db::INGREDIENTS
.iter() .iter()
.zip(langs) .zip(langs)
.filter_map(|tup| types::Ingredient::try_from(tup).ok()) .map(types::Ingredient::from)
.filter(|ing| opts.keys.is_none() || opts.keys.as_ref().unwrap().contains(&ing.key)) .filter(|ing| opts.keys.is_none() || opts.keys.as_ref().unwrap().contains(&ing.key))
.collect::<Vec<_>>() .collect::<Vec<_>>()
} }
@ -83,7 +83,7 @@ impl IngredientRepo for InMemoryIngredientRepo {
self.ingredients self.ingredients
.iter() .iter()
.zip(langs) .zip(langs)
.filter_map(|tup| types::Ingredient::try_from(tup).ok()) .map(types::Ingredient::from)
.filter(|ing| opts.keys.is_none() || opts.keys.as_ref().unwrap().contains(&ing.key)) .filter(|ing| opts.keys.is_none() || opts.keys.as_ref().unwrap().contains(&ing.key))
.collect::<Vec<_>>() .collect::<Vec<_>>()
} }