rust_recipe/
restricted_diet.rs

1use core::fmt;
2use std::str::FromStr;
3
4/// The type of dietary restrictions that a recipe caters for.
5/// See <https://schema.org/RestrictedDiet>
6#[derive(Debug, PartialEq)]
7pub enum RestrictedDiet {
8    UnknownDiet,
9    DiabeticDiet,
10    GlutenFreeDiet,
11    HalalDiet,
12    HinduDiet,
13    KosherDiet,
14    LowCalorieDiet,
15    LowFatDiet,
16    LowLactoseDiet,
17    LowSaltDiet,
18    VeganDiet,
19    VegetarianDiet,
20}
21
22#[derive(Debug)]
23pub struct RestrictedDietError;
24
25impl FromStr for RestrictedDiet {
26    type Err = RestrictedDietError;
27
28    fn from_str(s: &str) -> Result<Self, Self::Err> {
29        match s {
30            "UnknownDiet" => Ok(RestrictedDiet::UnknownDiet),
31            "DiabeticDiet" => Ok(RestrictedDiet::DiabeticDiet),
32            "GlutenFreeDiet" => Ok(RestrictedDiet::GlutenFreeDiet),
33            "HalalDiet" => Ok(RestrictedDiet::HalalDiet),
34            "HinduDiet" => Ok(RestrictedDiet::HinduDiet),
35            "KosherDiet" => Ok(RestrictedDiet::KosherDiet),
36            "LowCalorieDiet" => Ok(RestrictedDiet::LowCalorieDiet),
37            "LowFatDiet" => Ok(RestrictedDiet::LowFatDiet),
38            "LowLactoseDiet" => Ok(RestrictedDiet::LowLactoseDiet),
39            "LowSaltDiet" => Ok(RestrictedDiet::LowSaltDiet),
40            "VeganDiet" => Ok(RestrictedDiet::VeganDiet),
41            "VegetarianDiet" => Ok(RestrictedDiet::VegetarianDiet),
42            _ => Err(RestrictedDietError {}),
43        }
44    }
45}
46
47impl fmt::Display for RestrictedDiet {
48    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49        match self {
50            RestrictedDiet::UnknownDiet => write!(f, "Unknown"),
51            RestrictedDiet::DiabeticDiet => write!(f, " Diabetic"),
52            RestrictedDiet::GlutenFreeDiet => write!(f, "Gluten Free"),
53            RestrictedDiet::HalalDiet => write!(f, "Halal"),
54            RestrictedDiet::HinduDiet => write!(f, "Hindu"),
55            RestrictedDiet::KosherDiet => write!(f, "Kosher"),
56            RestrictedDiet::LowCalorieDiet => write!(f, "Low Calorie"),
57            RestrictedDiet::LowFatDiet => write!(f, "Low Fat"),
58            RestrictedDiet::LowLactoseDiet => write!(f, "Low Lactose"),
59            RestrictedDiet::LowSaltDiet => write!(f, "Low Salt"),
60            RestrictedDiet::VeganDiet => write!(f, "Vegan"),
61            RestrictedDiet::VegetarianDiet => write!(f, "Vegetarian"),
62        }
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn test_from_str_success() -> Result<(), RestrictedDietError> {
72        assert_eq!(RestrictedDiet::UnknownDiet, "UnknownDiet".parse()?);
73        assert_eq!(RestrictedDiet::DiabeticDiet, "DiabeticDiet".parse()?);
74        assert_eq!(RestrictedDiet::GlutenFreeDiet, "GlutenFreeDiet".parse()?);
75        assert_eq!(RestrictedDiet::HalalDiet, "HalalDiet".parse()?);
76        assert_eq!(RestrictedDiet::HinduDiet, "HinduDiet".parse()?);
77        assert_eq!(RestrictedDiet::KosherDiet, "KosherDiet".parse()?);
78        assert_eq!(RestrictedDiet::LowCalorieDiet, "LowCalorieDiet".parse()?);
79        assert_eq!(RestrictedDiet::LowFatDiet, "LowFatDiet".parse()?);
80        assert_eq!(RestrictedDiet::LowLactoseDiet, "LowLactoseDiet".parse()?);
81        assert_eq!(RestrictedDiet::LowSaltDiet, "LowSaltDiet".parse()?);
82        assert_eq!(RestrictedDiet::VeganDiet, "VeganDiet".parse()?);
83        assert_eq!(RestrictedDiet::VegetarianDiet, "VegetarianDiet".parse()?);
84        Ok(())
85    }
86
87    #[test]
88    fn test_from_str_failure() {
89        let res = "Invalid".parse::<RestrictedDiet>();
90        assert!(res.is_err())
91    }
92}