flagd_evaluation_engine/model/
value_converter.rs1use 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}