statsig_rust/evaluation/
dynamic_string.rs

1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2use serde_json::Value as JsonValue;
3
4#[derive(Clone, PartialEq, 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 From<&String> for DynamicString {
41    fn from(value: &String) -> Self {
42        DynamicString {
43            value: value.clone(),
44            lowercased_value: value.clone().to_lowercase(),
45        }
46    }
47}