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        // Serialize only the original value field
16        serializer.serialize_str(&self.value)
17    }
18}
19
20impl<'de> Deserialize<'de> for DynamicString {
21    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
22    where
23        D: Deserializer<'de>,
24    {
25        let json_value = JsonValue::deserialize(deserializer)?;
26        let value = match json_value {
27            JsonValue::String(value) => value,
28            _ => {
29                return Err(serde::de::Error::custom("Expected a string"));
30            }
31        };
32
33        Ok(DynamicString {
34            lowercased_value: value.to_lowercase(),
35            value: value.to_string(),
36        })
37    }
38}
39
40impl PartialEq for DynamicString {
41    fn eq(&self, other: &Self) -> bool {
42        self.value == other.value
43    }
44}
45
46impl From<Value> for DynamicString {
47    fn from(value: Value) -> Self {
48        let str_value = match value.as_str() {
49            Some(value) => value.to_string(),
50            None => value.to_string(),
51        };
52        DynamicString::from(str_value)
53    }
54}
55
56impl From<String> for DynamicString {
57    fn from(value: String) -> Self {
58        let lowercased_value = value.to_lowercase();
59        DynamicString {
60            value,
61            lowercased_value,
62        }
63    }
64}