tf2_enum/
sheen.rs

1use crate::{
2    Attribute,
3    AttributeDef,
4    DescriptionFormat,
5    EffectType,
6    ItemAttribute,
7    TryFromIntAttributeValue,
8};
9use num_enum::{IntoPrimitive, TryFromPrimitive};
10use serde_repr::{Deserialize_repr, Serialize_repr};
11use strum::{Display, EnumCount, EnumIter, EnumString};
12
13/// Sheen.
14#[derive(
15    Debug,
16    Clone,
17    Copy,
18    Eq,
19    PartialEq,
20    Ord,
21    PartialOrd,
22    Hash,
23    Display,
24    Serialize_repr,
25    Deserialize_repr,
26    EnumString,
27    EnumIter,
28    EnumCount,
29    TryFromPrimitive,
30    IntoPrimitive,
31)]
32#[repr(u32)]
33#[strum(serialize_all = "title_case")]
34#[allow(missing_docs)]
35pub enum Sheen {
36    TeamShine = 1,
37    DeadlyDaffodil = 2,
38    Manndarin = 3,
39    MeanGreen = 4,
40    AgonizingEmerald = 5,
41    VillainousViolet = 6,
42    HotRod = 7,
43}
44
45impl Attribute for Sheen {
46    const DEFINDEX: u32 = 2014;
47    const USES_FLOAT_VALUE: bool = true;
48    /// Represents the "killstreak_idleeffect" attribute.
49    const ATTRIBUTE: AttributeDef = AttributeDef {
50        defindex: 2014,
51        name: "killstreak idleeffect",
52        attribute_class: Some("killstreak_idleeffect"),
53        description_string: Some("Sheen: %s1"),
54        description_format: Some(DescriptionFormat::ValueIsKillstreakIdleEffectIndex),
55        effect_type: EffectType::Positive,
56        hidden: false,
57        stored_as_integer: false,
58    };
59    
60    /// Gets the attribute float value.
61    fn attribute_float_value(&self) -> Option<f32> {
62        Some((*self as u32) as f32)
63    }
64}
65
66impl TryFromIntAttributeValue for Sheen {}
67
68impl From<Sheen> for ItemAttribute {
69    fn from(val: Sheen) -> Self {
70        ItemAttribute {
71            defindex: Sheen::DEFINDEX,
72            value: val.attribute_value(),
73            float_value: val.attribute_float_value(),
74        }
75    }
76}
77
78#[cfg(test)]
79mod tests {
80    use super::*;
81    use std::str::FromStr;
82
83    #[test]
84    fn test_display_and_parse() {
85        assert_eq!(Sheen::from_str("Hot Rod").unwrap(), Sheen::HotRod);
86        assert_eq!(Sheen::HotRod.to_string(), "Hot Rod");
87    }
88
89    #[test]
90    fn test_serde_repr() {
91        let s = serde_json::to_string(&Sheen::MeanGreen).unwrap();
92        assert_eq!(s, "4");
93        let d: Sheen = serde_json::from_str("4").unwrap();
94        assert_eq!(d, Sheen::MeanGreen);
95    }
96    
97    #[test]
98    fn accepts_attibute_argument() {
99        fn attribute_float_value<A: Attribute>(attribute: A) -> Option<f32> {
100            attribute.attribute_float_value()
101        }
102        
103        assert_eq!(attribute_float_value(Sheen::DeadlyDaffodil), Some(2.0));
104    }
105}