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#[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 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 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}