recipes/api/src/domain/ingredient/types.rs

56 lines
1.2 KiB
Rust

use std::str::FromStr;
#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize)]
pub enum Lang {
Rus,
#[allow(dead_code)]
Eng,
}
impl Default for Lang {
fn default() -> Self {
Lang::Rus
}
}
impl FromStr for Lang {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Rus" | "rus" => Ok(Lang::Rus),
"Eng" | "eng" => Ok(Lang::Eng),
_ => Err(()),
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct Ingredient {
pub key: String,
pub lang: Lang,
pub name: String,
}
impl From<&db::data::Ingredient> for Ingredient {
fn from(db: &db::data::Ingredient) -> Self {
Self::try_from((db, Lang::Rus)).unwrap()
}
}
impl From<(&db::data::Ingredient, Lang)> for Ingredient {
fn from((db, lang): (&db::data::Ingredient, Lang)) -> Self {
let tr = &db.translates;
let name = match lang {
Lang::Rus => tr.rus,
Lang::Eng => tr.eng.unwrap_or(tr.rus),
};
Self {
key: db.key.to_string(),
lang: if name == tr.rus { Lang::Rus } else { lang },
name: name.to_string(),
}
}
}