statsig_rust/evaluation/
dynamic_returnable.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use serde_json::Value as JsonValue;
5
6#[derive(Clone, PartialEq, Debug)]
7pub enum DynamicReturnable {
8    Bool(bool),
9    Json(HashMap<String, JsonValue>),
10}
11
12impl DynamicReturnable {
13    pub fn get_bool(&self) -> Option<bool> {
14        match self {
15            DynamicReturnable::Bool(b) => Some(*b),
16            _ => None,
17        }
18    }
19
20    pub fn get_json(&self) -> Option<HashMap<String, JsonValue>> {
21        match self {
22            DynamicReturnable::Json(json) => Some(json.clone()),
23            _ => None,
24        }
25    }
26}
27
28impl<'de> Deserialize<'de> for DynamicReturnable {
29    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
30    where
31        D: Deserializer<'de>,
32    {
33        let json_value = JsonValue::deserialize(deserializer)?;
34        match json_value {
35            JsonValue::Bool(b) => Ok(DynamicReturnable::Bool(b)),
36            JsonValue::Object(obj) => Ok(DynamicReturnable::Json(obj.into_iter().collect())),
37            _ => Err(serde::de::Error::custom("Invalid JSON value")),
38        }
39    }
40}
41
42impl Serialize for DynamicReturnable {
43    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        match self {
48            DynamicReturnable::Bool(b) => b.serialize(serializer),
49            DynamicReturnable::Json(json) => json.serialize(serializer),
50        }
51    }
52}