statsig_rust/evaluation/
dynamic_returnable.rs1use 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}