tf2_enum/
attribute_value.rs

1use serde::{Deserialize, Serialize};
2
3/// A value for an attribute.
4#[derive(Debug, Default, Clone, PartialEq, PartialOrd, Serialize, Deserialize)]
5#[serde(untagged)]
6pub enum AttributeValue {
7    /// Represents an integer attribute value.
8    Integer(u32),
9    /// Represents a float attribute value.
10    Float(f32),
11    /// Represents a string attribute value.
12    String(String),
13    /// No value.
14    #[default]
15    None,
16}
17
18impl From<u32> for AttributeValue {
19    fn from(value: u32) -> Self {
20        AttributeValue::Integer(value)
21    }
22}
23
24impl From<f32> for AttributeValue {
25    fn from(value: f32) -> Self {
26        AttributeValue::Float(value)
27    }
28}
29
30impl From<String> for AttributeValue {
31    fn from(value: String) -> Self {
32        AttributeValue::String(value)
33    }
34}
35
36impl From<&String> for AttributeValue {
37    fn from(value: &String) -> Self {
38        AttributeValue::String(value.clone())
39    }
40}
41
42impl From<&str> for AttributeValue {
43    fn from(value: &str) -> Self {
44        AttributeValue::String(value.to_string())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51    
52    #[test]
53    fn serializes() {
54        let int_value = AttributeValue::Integer(42);
55        let float_value = AttributeValue::Float(3.14);
56        let string_value = AttributeValue::String("Hello".into());
57
58        let int_json = serde_json::to_string(&int_value).unwrap();
59        let float_json = serde_json::to_string(&float_value).unwrap();
60        let string_json = serde_json::to_string(&string_value).unwrap();
61        
62        assert_eq!(int_json, r#"42"#);
63        assert_eq!(float_json, r#"3.14"#);
64        assert_eq!(string_json, r#""Hello""#);
65    }
66}