Skip to main content

flagd_evaluation_engine/model/
value_converter.rs

1use open_feature::Value;
2
3pub trait ValueConverter {
4    fn to_serde_json(&self) -> serde_json::Value;
5    fn from_serde_json(value: &serde_json::Value) -> Option<Value>;
6}
7
8impl ValueConverter for Value {
9    fn to_serde_json(&self) -> serde_json::Value {
10        match self {
11            Value::String(s) => serde_json::Value::String(s.clone()),
12            Value::Bool(b) => serde_json::Value::Bool(*b),
13            Value::Int(i) => serde_json::Value::Number((*i).into()),
14            Value::Float(f) => serde_json::Number::from_f64(*f)
15                .map(serde_json::Value::Number)
16                .unwrap_or(serde_json::Value::Null),
17            Value::Array(_) => serde_json::Value::Array(vec![]),
18            Value::Struct(_) => serde_json::Value::Object(serde_json::Map::new()),
19        }
20    }
21
22    fn from_serde_json(value: &serde_json::Value) -> Option<Value> {
23        match value {
24            serde_json::Value::String(s) => Some(Value::String(s.clone())),
25            serde_json::Value::Bool(b) => Some(Value::Bool(*b)),
26            serde_json::Value::Number(n) => {
27                if n.is_i64() {
28                    Some(Value::Int(n.as_i64()?))
29                } else {
30                    Some(Value::Float(n.as_f64()?))
31                }
32            }
33            _ => None,
34        }
35    }
36}