|
1 |
| -use minijinja::value::Value; |
2 |
| -use minijinja::{Error, ErrorKind, State}; |
3 |
| -use std::env::VarError; |
| 1 | +use minijinja::value::{StructObject, Value}; |
| 2 | +use minijinja::{Error, State}; |
4 | 3 |
|
5 |
| -pub fn process_env(_state: &State, var_name: &Value) -> Result<String, Error> { |
6 |
| - let var_name = var_name.as_str().ok_or_else(|| { |
7 |
| - Error::new( |
8 |
| - ErrorKind::MissingArgument, |
9 |
| - "The argument `var_name` for function `processEnv(var_name)` is missing.", |
10 |
| - ) |
11 |
| - })?; |
| 4 | +pub struct ProcessEnv; |
| 5 | +impl StructObject for ProcessEnv { |
| 6 | + fn get_field(&self, field: &str) -> Option<Value> { |
| 7 | + // std::env::var(var_name) |
| 8 | + // .map(|v| Value::from_safe_string(v)) |
| 9 | + // .map_err(|e| match e { |
| 10 | + // VarError::NotPresent => Error::new( |
| 11 | + // ErrorKind::NonKey, |
| 12 | + // format!("The process env variable `{var_name}` is not defined."), |
| 13 | + // ), |
| 14 | + // VarError::NotUnicode(_) => Error::new( |
| 15 | + // ErrorKind::UndefinedError, |
| 16 | + // format!("The process env variable `{var_name}` has an invalid unicode value."), |
| 17 | + // ), |
| 18 | + // }) |
| 19 | + std::env::var(field).map(Value::from_safe_string).ok() |
| 20 | + } |
| 21 | +} |
12 | 22 |
|
13 |
| - std::env::var(var_name).map_err(|e| match e { |
14 |
| - VarError::NotPresent => Error::new( |
15 |
| - ErrorKind::NonKey, |
16 |
| - format!("The process env variable `{var_name}` is not defined."), |
17 |
| - ), |
18 |
| - VarError::NotUnicode(_) => Error::new( |
19 |
| - ErrorKind::UndefinedError, |
20 |
| - format!("The process env variable `{var_name}` has an invalid unicode value."), |
21 |
| - ), |
22 |
| - }) |
| 23 | +/// function for minijinja |
| 24 | +pub fn process_env(_: &State, var_name: &str) -> Result<Value, Error> { |
| 25 | + Ok(ProcessEnv.get_field(var_name).unwrap_or_default()) |
23 | 26 | }
|
24 | 27 |
|
25 | 28 | #[cfg(test)]
|
26 | 29 | mod tests {
|
| 30 | + use crate::domain::environment::Environment; |
| 31 | + use crate::template::Renderer; |
27 | 32 | use crate::test_utils::RenderBuilder;
|
28 | 33 | use std::collections::HashMap;
|
29 | 34 |
|
@@ -51,6 +56,21 @@ mod tests {
|
51 | 56 | );
|
52 | 57 | }
|
53 | 58 |
|
| 59 | + #[test] |
| 60 | + fn should_resolve_lazy_via_env_virtuell_object() { |
| 61 | + let mut r = Renderer::new(&Environment::default()); |
| 62 | + #[cfg(not(windows))] |
| 63 | + assert_eq!( |
| 64 | + r.render(r#"{{ env.USER }}"#, "template").unwrap(), |
| 65 | + std::env::var("USER").unwrap() |
| 66 | + ); |
| 67 | + #[cfg(windows)] |
| 68 | + assert_eq!( |
| 69 | + r.render(r#"{{ env.USERNAME }}"#, "template").unwrap(), |
| 70 | + std::env::var("USERNAME").unwrap() |
| 71 | + ); |
| 72 | + } |
| 73 | + |
54 | 74 | #[test]
|
55 | 75 | fn should_provide_process_env_var_via_env_object() {
|
56 | 76 | // TODO: this is just a toy around case
|
|
0 commit comments