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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use std::{fmt, str::FromStr};

pub enum CowShape {
    Clippy,
    Cow,
    Moose,
    Ferris,
}

const COW: &str = r#"
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||"#;

const CLIPPY: &str = r#"
         \
          \
             __
            /  \
            |  |
            @  @
            |  |
            || |/
            || ||
            |\_/|
            \___/"#;

const FERRIS: &str = r#"
        \
         \
            _~^~^~_
        \) /  o o  \ (/
          '_   -   _'
          / '-----' \"#;

const MOOSE: &str = r#"
  \
   \   \_\_    _/_/
    \      \__/
           (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||"#;

impl fmt::Display for CowShape {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let display = match self {
            CowShape::Cow => COW,
            CowShape::Clippy => CLIPPY,
            CowShape::Ferris => FERRIS,
            CowShape::Moose => MOOSE,
        };
        f.write_str(display)
    }
}

impl FromStr for CowShape {
    type Err = &'static str;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "cow" => Ok(CowShape::Cow),
            "clippy" => Ok(CowShape::Clippy),
            "ferris" => Ok(CowShape::Ferris),
            "moose" => Ok(CowShape::Moose),
            _ => Err("Unknown Value"),
        }
    }
}