config_lite/parser/
mod.rs

1use fancy_regex::Regex;
2
3use crate::{ConfigError, ConfigResult};
4
5pub mod json;
6pub mod yaml;
7
8pub(crate) fn get_value_from_env_var<'a, T: for<'de> serde::Deserialize<'de>>(
9    value: &str,
10) -> ConfigResult<T> {
11    // not expected to fail
12    let re = Regex::new(r"\{\{(\w+)\}\}").unwrap();
13    if let Ok(c) = re.captures(value) {
14        match c {
15            Some(c) => {
16                let env_var_name = c
17                    .get(1)
18                    .ok_or_else(|| ConfigError::RegexError(value.to_string()))?
19                    .as_str();
20                // handle error getting env vars
21                let value = std::env::var(env_var_name)?;
22                let value = serde_json::Value::String(value);
23                Ok(serde_json::from_value(value)?)
24            }
25            None => {
26                let value = serde_json::Value::String(value.to_string());
27                Ok(serde_json::from_value(value)?)
28            }
29        }
30    } else {
31        Err(ConfigError::RegexError(value.into()))
32    }
33}