git_release_name/
case.rs

1use std::str::FromStr;
2
3/// The various cases that can be supported. This is a type used to coerce
4/// from a string to the enum.
5#[derive(Debug, Eq, PartialEq, Copy, Clone)]
6pub enum Case {
7    Snake,
8    Kebab,
9    Pascal,
10    Camel,
11    Title,
12    Sentence,
13    Lower,
14    Upper,
15}
16
17#[derive(Debug, Eq, PartialEq)]
18pub enum ParseCaseError {
19    InvalidFormat,
20}
21
22impl FromStr for Case {
23    type Err = ParseCaseError;
24
25    fn from_str(format: &str) -> Result<Case, ParseCaseError> {
26        let case = match format {
27            "snake" => Case::Snake,
28            "kebab" => Case::Kebab,
29            "pascal" => Case::Pascal,
30            "camel" => Case::Camel,
31            "title" => Case::Title,
32            "sentence" => Case::Sentence,
33            "lower" => Case::Lower,
34            "upper" => Case::Upper,
35            _ => return Err(ParseCaseError::InvalidFormat),
36        };
37
38        Ok(case)
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn str_can_be_parsed_to_a_format() {
48        assert_eq!(Case::Snake, "snake".parse::<Case>().unwrap());
49        assert_eq!(Case::Kebab, "kebab".parse::<Case>().unwrap());
50        assert_eq!(Case::Camel, "camel".parse::<Case>().unwrap());
51        assert_eq!(Case::Pascal, "pascal".parse::<Case>().unwrap());
52        assert_eq!(Case::Title, "title".parse::<Case>().unwrap());
53        assert_eq!(Case::Sentence, "sentence".parse::<Case>().unwrap());
54        assert_eq!(Case::Lower, "lower".parse::<Case>().unwrap());
55        assert_eq!(Case::Upper, "upper".parse::<Case>().unwrap());
56        assert!("alsdkfj".parse::<Case>().is_err());
57    }
58}