use crate::model::config::{post_process_config, Config};
use crate::r#override::source::OverrideDataSource;
use crate::{Setting, Value};
use serde::Deserialize;
use std::collections::HashMap;
use std::fs;
#[derive(Deserialize)]
pub struct SimplifiedConfig {
pub flags: HashMap<String, Value>,
}
pub struct FileDataSource {
config: Config,
}
impl FileDataSource {
pub fn new(file_path: &str) -> Result<Self, String> {
let content_result = fs::read_to_string(file_path);
match content_result {
Ok(content) => {
let simple_result = serde_json::from_str::<SimplifiedConfig>(content.as_str());
match simple_result {
Ok(simple_config) => {
let mut map: HashMap<String, Setting> = HashMap::new();
for (k, value) in &simple_config.flags {
map.insert(k.clone(), value.into());
}
Ok(FileDataSource {
config: Config {
settings: map,
salt: None,
segments: None,
preferences: None,
},
})
}
Err(_) => match serde_json::from_str::<Config>(content.as_str()) {
Ok(mut config) => {
post_process_config(&mut config);
Ok(FileDataSource { config })
}
Err(err) => Err(err.to_string()),
},
}
}
Err(err) => Err(err.to_string()),
}
}
}
impl OverrideDataSource for FileDataSource {
fn settings(&self) -> &HashMap<String, Setting> {
&self.config.settings
}
}