statsig_rust/evaluation/
dynamic_string.rs

1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2use serde_json::{Value as JsonValue, Value};
3
4#[derive(Clone, Eq, Debug)]
5pub struct DynamicString {
6    pub value: String,
7    pub lowercased_value: String,
8}
9
10impl Serialize for DynamicString {
11    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12    where
13        S: Serializer,
14    {
15        if let Ok(bool_value) = self.value.parse::<bool>() {
16            return serializer.serialize_bool(bool_value);
17        }
18
19        serializer.serialize_str(&self.value)
20    }
21}
22
23impl<'de> Deserialize<'de> for DynamicString {
24    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
25    where
26        D: Deserializer<'de>,
27    {
28        let json_value = JsonValue::deserialize(deserializer)?;
29        let value = match json_value {
30            JsonValue::String(value) => value,
31            _ => {
32                return Err(serde::de::Error::custom("Expected a string"));
33            }
34        };
35
36        Ok(DynamicString {
37            lowercased_value: value.to_lowercase(),
38            value: value.to_string(),
39        })
40    }
41}
42
43impl PartialEq for DynamicString {
44    fn eq(&self, other: &Self) -> bool {
45        self.value == other.value
46    }
47}
48
49impl From<Value> for DynamicString {
50    fn from(value: Value) -> Self {
51        let str_value = match value.as_str() {
52            Some(value) => value.to_string(),
53            None => value.to_string(),
54        };
55        DynamicString::from(str_value)
56    }
57}
58
59impl From<String> for DynamicString {
60    fn from(value: String) -> Self {
61        let lowercased_value = value.to_lowercase();
62        DynamicString {
63            value,
64            lowercased_value,
65        }
66    }
67}