envuse_parser/envuse/
program.rs

1use crate::errors::program_error::ProgramError;
2use crate::transformers::kinds::custom_transform::CustomTransform;
3
4use super::super::parser::ast::Expression;
5use super::super::transformers::kinds::boolean_transform::BooleanTransform;
6use super::super::transformers::kinds::number_transform::NumberTransform;
7use super::super::transformers::kinds::string_transform::StringTransform;
8use super::super::transformers::parser::Parser;
9use super::super::transformers::transformer_list::TransformerList;
10use super::super::transformers::value_types::ValueType;
11use super::to_custom_transformers::ToCustomTransformers;
12use super::{super::envuse::to_envs::ToEnvs, display_program_error::display_program_error};
13use serde::{Deserialize, Serialize};
14use std::collections::BTreeMap;
15
16/// The program is a structure content the filename and the source
17#[derive(Debug, Serialize, Deserialize)]
18pub struct Program {
19    pub location: Option<String>,
20    pub source: String,
21    pub ast: Expression,
22}
23
24impl Program {
25    pub fn parse<T, D>(
26        &self,
27        values: T,
28        custom_transformers: D,
29    ) -> Result<BTreeMap<String, ValueType>, Box<dyn std::error::Error>>
30    where
31        T: ToEnvs,
32        D: ToCustomTransformers,
33    {
34        display_program_error(
35            self.parse_unwrap(values, custom_transformers),
36            self.source.clone(),
37            self.location.clone(),
38        )
39    }
40
41    fn parse_unwrap<T, D>(
42        &self,
43        values: T,
44        custom_transformers: D,
45    ) -> Result<BTreeMap<String, ValueType>, Box<dyn std::error::Error>>
46    where
47        T: ToEnvs,
48        D: ToCustomTransformers,
49    {
50        let mut transformer_list: TransformerList = Default::default();
51
52        // transformer_list.insert("unknown", Box::new(StringTransform));
53        transformer_list.insert("str", Box::new(StringTransform));
54        transformer_list.insert("string", Box::new(StringTransform));
55        transformer_list.insert("int", Box::new(NumberTransform));
56        transformer_list.insert("number", Box::new(NumberTransform));
57        transformer_list.insert("bool", Box::new(BooleanTransform));
58        transformer_list.insert("boolean", Box::new(BooleanTransform));
59
60        for key in custom_transformers.to_vec() {
61            transformer_list.insert(key.to_lowercase(), Box::new(CustomTransform));
62        }
63
64        let envs_values = values.to_envs();
65
66        let document = match self.ast.as_document() {
67            Some(document) => document,
68            _ => {
69                do yeet ProgramError::from((
70                    self,
71                    "AST Parser error, the ast expressions is not Expression::Document",
72                ))
73            }
74        };
75
76        let expressions = &document.elements;
77
78        let mut configs: BTreeMap<String, ValueType> = BTreeMap::new();
79
80        for expression in expressions {
81            let variable = match expression.as_variable() {
82                Some(variable) => variable,
83                _ => do yeet ProgramError::from((self, "Expression is not supported")),
84            };
85
86            let value = Parser::to_parse_variable(&transformer_list, &variable, &envs_values)?;
87
88            configs.insert(variable.name.to_string(), value);
89        }
90
91        Ok(configs)
92    }
93}