comtrya_lib/contexts/variable_include/
mod.rs

1use std::collections::HashMap;
2
3use anyhow::Result;
4use reqwest::Url;
5
6use crate::{config::Config, contexts::Context, contexts::ContextProvider};
7
8pub mod dns;
9pub mod file;
10
11pub struct VariableIncludeContextProvider<'a> {
12    pub config: &'a Config,
13}
14
15impl<'a> ContextProvider for VariableIncludeContextProvider<'a> {
16    fn get_prefix(&self) -> String {
17        String::from("include_variables")
18    }
19
20    fn get_contexts(&self) -> Result<Vec<super::Context>> {
21        let mut contexts = HashMap::<String, String>::new();
22
23        if let Some(variable_includes) = &self.config.include_variables {
24            for variable_include in variable_includes {
25                let url = Url::parse(variable_include)?;
26
27                if url.scheme() == "dns+txt" {
28                    dns::txt_record_values(&url, &mut contexts)?;
29                } else if url.scheme() == "file+toml" {
30                    file::toml_values(&url, &mut contexts)?;
31                } else if url.scheme() == "file+yaml" {
32                    file::yaml_values(&url, &mut contexts)?;
33                } else {
34                    return Err(anyhow::anyhow!(
35                        "Unknown variable include scheme: {}",
36                        url.scheme()
37                    ));
38                }
39            }
40        }
41
42        let contexts = contexts
43            .into_iter()
44            .map(|(key, value)| Context::KeyValueContext(key, value.into()))
45            .collect::<Vec<_>>();
46
47        Ok(contexts)
48    }
49}