open_feature_flagd/resolver/in_process/model/
flag_parser.rs1use super::feature_flag::FeatureFlag;
2use super::feature_flag::ParsingResult;
3use crate::error::FlagdError;
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, FlagdError> {
11 let value: Value = serde_json::from_str(configuration)?;
12 let obj = value
13 .as_object()
14 .ok_or_else(|| FlagdError::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 FlagdError::Parse("No flag configurations found in the payload".to_string())
21 })?;
22
23 let flag_set_metadata = obj
24 .get("metadata")
25 .and_then(|v| v.as_object())
26 .map(Self::convert_map_to_hashmap)
27 .unwrap_or_default();
28
29 let mut flag_map = HashMap::new();
30 for (key, value) in flags {
31 let flag: FeatureFlag = serde_json::from_value(value.clone())?;
32 flag_map.insert(key.clone(), flag);
33 }
34
35 Ok(ParsingResult {
36 flags: flag_map,
37 flag_set_metadata,
38 })
39 }
40
41 fn convert_map_to_hashmap(map: &Map<String, Value>) -> HashMap<String, serde_json::Value> {
42 map.iter().map(|(k, v)| (k.clone(), v.clone())).collect()
43 }
44}