1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use failure::Fail;
use std::str::FromStr;

#[derive(Clone, Debug, Fail)]
#[fail(display = "Invalid language string '{}'", _0)]
pub struct LanguageParseError(String);

#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum Language {
    Japanese,
    English,
    German,
    French,
}

impl FromStr for Language {
    type Err = LanguageParseError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match &*s.to_uppercase() {
            "JAPANESE" | "JA" => Ok(Language::Japanese),
            "ENGLISH" | "EN" => Ok(Language::English),
            "GERMAN" | "DE" => Ok(Language::German),
            "FRENCH" | "FR" => Ok(Language::French),
            x => Err(LanguageParseError(x.into())),
        }
    }
}