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
72
73
74
#[cfg(not(any(
    feature = "Debug",
    feature = "PartialEq",
    feature = "Eq",
    feature = "PartialOrd",
    feature = "Ord",
    feature = "Hash",
    feature = "Default",
    feature = "Clone",
    feature = "Copy",
    feature = "Deref",
    feature = "DerefMut"
)))]
compile_error!("at least one of the trait features must be enabled");

#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Ordinalize)]
#[cfg_attr(not(feature = "default"), allow(dead_code))]
pub enum Trait {
    #[cfg(feature = "Debug")]
    Debug,
    #[cfg(feature = "PartialEq")]
    PartialEq,
    #[cfg(feature = "Eq")]
    Eq,
    #[cfg(feature = "PartialOrd")]
    PartialOrd,
    #[cfg(feature = "Ord")]
    Ord,
    #[cfg(feature = "Hash")]
    Hash,
    #[cfg(feature = "Default")]
    Default,
    #[cfg(feature = "Clone")]
    Clone,
    #[cfg(feature = "Copy")]
    Copy,
    #[cfg(feature = "Deref")]
    Deref,
    #[cfg(feature = "DerefMut")]
    DerefMut,
}

impl Trait {
    #[inline]
    pub fn from_str<S: AsRef<str>>(s: S) -> Trait {
        let s = s.as_ref();

        match s {
            #[cfg(feature = "Debug")]
            "Debug" => Trait::Debug,
            #[cfg(feature = "PartialEq")]
            "PartialEq" => Trait::PartialEq,
            #[cfg(feature = "Eq")]
            "Eq" => Trait::Eq,
            #[cfg(feature = "PartialOrd")]
            "PartialOrd" => Trait::PartialOrd,
            #[cfg(feature = "Ord")]
            "Ord" => Trait::Ord,
            #[cfg(feature = "Hash")]
            "Hash" => Trait::Hash,
            #[cfg(feature = "Default")]
            "Default" => Trait::Default,
            #[cfg(feature = "Clone")]
            "Clone" => Trait::Clone,
            #[cfg(feature = "Copy")]
            "Copy" => Trait::Copy,
            #[cfg(feature = "Deref")]
            "Deref" => Trait::Deref,
            #[cfg(feature = "DerefMut")]
            "DerefMut" => Trait::DerefMut,
            _ => panic!("Unsupported trait `{}`. Available traits are {:?}", s, Trait::variants()),
        }
    }
}