use std::str;
use std::sync::Arc;
use anyhow::Result;
use serde_json::Value;
use super::resolver::ResolverChain;
use super::storage::Storage;
use super::template::{merge_templates, populate_template};
#[derive(Clone)]
pub struct State {
chain: Arc<ResolverChain>,
storage: Arc<Storage>,
default_template: Option<String>,
}
impl State {
pub fn new(chain: ResolverChain, storage: Storage, default_template: Option<&str>) -> Self {
Self {
chain: Arc::new(chain),
storage: Arc::new(storage),
default_template: default_template.map(String::from),
}
}
pub async fn read_template(&self, env: &str) -> Result<Value> {
self.storage.get(env).await
}
pub async fn write_template(&self, env: &str, template: &Value) -> Result<()> {
self.storage.set(env, template).await
}
pub async fn load_config(&self, env: &str) -> Result<Value> {
let mut template = self.read_template(env).await?;
populate_template(&mut template, &self.chain).await?;
if let Some(default_env) = &self.default_template {
if env != default_env {
let mut default_template = self.read_template(default_env).await?;
populate_template(&mut default_template, &self.chain).await?;
merge_templates(&mut template, &default_template)
}
}
Ok(template)
}
pub async fn list_configs(&self) -> Result<Vec<String>> {
let mut templates = self.storage.list().await?;
templates.sort_unstable();
Ok(templates)
}
}