flagd-evaluation-engine 0.0.3

Evaluation engine for flagd - JSONLogic-based targeting rules
Documentation
use open_feature::Value;

pub trait ValueConverter {
    fn to_serde_json(&self) -> serde_json::Value;
    fn from_serde_json(value: &serde_json::Value) -> Option<Value>;
}

impl ValueConverter for Value {
    fn to_serde_json(&self) -> serde_json::Value {
        match self {
            Value::String(s) => serde_json::Value::String(s.clone()),
            Value::Bool(b) => serde_json::Value::Bool(*b),
            Value::Int(i) => serde_json::Value::Number((*i).into()),
            Value::Float(f) => serde_json::Number::from_f64(*f)
                .map(serde_json::Value::Number)
                .unwrap_or(serde_json::Value::Null),
            Value::Array(_) => serde_json::Value::Array(vec![]),
            Value::Struct(_) => serde_json::Value::Object(serde_json::Map::new()),
        }
    }

    fn from_serde_json(value: &serde_json::Value) -> Option<Value> {
        match value {
            serde_json::Value::String(s) => Some(Value::String(s.clone())),
            serde_json::Value::Bool(b) => Some(Value::Bool(*b)),
            serde_json::Value::Number(n) => {
                if n.is_i64() {
                    Some(Value::Int(n.as_i64()?))
                } else {
                    Some(Value::Float(n.as_f64()?))
                }
            }
            _ => None,
        }
    }
}