envuse_parser/envuse/
program.rs1use 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#[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("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}