Skip to main content

flagd_evaluation_engine/model/
flag_parser.rs

1use super::feature_flag::FeatureFlag;
2use super::feature_flag::ParsingResult;
3use crate::error::FlagdEvaluationError;
4use serde_json::{Map, Value};
5use std::collections::HashMap;
6
7pub struct FlagParser;
8
9impl FlagParser {
10    pub fn parse_string(configuration: &str) -> Result<ParsingResult, FlagdEvaluationError> {
11        let value: Value = serde_json::from_str(configuration)?;
12        let obj = value
13            .as_object()
14            .ok_or_else(|| FlagdEvaluationError::Parse("Invalid JSON structure".to_string()))?;
15
16        let flags = obj
17            .get("flags")
18            .and_then(|v| v.as_object())
19            .ok_or_else(|| {
20                FlagdEvaluationError::Parse(
21                    "No flag configurations found in the payload".to_string(),
22                )
23            })?;
24
25        let flag_set_metadata = obj
26            .get("metadata")
27            .and_then(|v| v.as_object())
28            .map(Self::convert_map_to_hashmap)
29            .unwrap_or_default();
30
31        let mut flag_map = HashMap::new();
32        for (key, value) in flags {
33            let flag: FeatureFlag = serde_json::from_value(value.clone())?;
34            flag_map.insert(key.clone(), flag);
35        }
36
37        Ok(ParsingResult {
38            flags: flag_map,
39            flag_set_metadata,
40        })
41    }
42
43    fn convert_map_to_hashmap(map: &Map<String, Value>) -> HashMap<String, serde_json::Value> {
44        map.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
45    }
46}