From 22592651077f11550d387b2d32dd66d4594b9b42 Mon Sep 17 00:00:00 2001 From: lifning <> Date: Fri, 10 Dec 2021 18:57:25 -0800 Subject: [PATCH] first pass at env variable component --- .../src/provided/stdlib/variables/env.rs | 34 +++++++++++++++++++ .../src/provided/stdlib/variables/mod.rs | 5 +++ .../{variables.rs => variables/store.rs} | 0 3 files changed, 39 insertions(+) create mode 100644 ferretro_components/src/provided/stdlib/variables/env.rs create mode 100644 ferretro_components/src/provided/stdlib/variables/mod.rs rename ferretro_components/src/provided/stdlib/{variables.rs => variables/store.rs} (100%) diff --git a/ferretro_components/src/provided/stdlib/variables/env.rs b/ferretro_components/src/provided/stdlib/variables/env.rs new file mode 100644 index 0000000..c73b3bf --- /dev/null +++ b/ferretro_components/src/provided/stdlib/variables/env.rs @@ -0,0 +1,34 @@ +use std::collections::BTreeMap; +use crate::prelude::*; + +#[derive(Default)] +pub struct EnvironmentVariableComponent { + variables: BTreeMap, +} + +impl RetroComponent for EnvironmentVariableComponent {} + +impl RetroCallbacks for EnvironmentVariableComponent { + fn get_variable(&mut self, key: &str) -> Option { + self.variables.get(key).cloned() + } + + fn set_variables(&mut self, variables: &[Variable2]) -> Option { + for v in variables { + println!("# {}", v.description); + let value = if let Ok(x) = std::env::var(&v.key) { + if !v.options.contains(&x) { + panic!("Invalid value {:?} for variable {:?} (expected one of {:?})", x, v.key, v.options); + } else if x != v.options[0] { + println!("# (overridden, default {})", v.options[0]); + } + x + } else { + v.options[0].clone() + }; + println!("{}={} # {:?}", v.key, value, v.options); + self.variables.insert(v.key.to_owned(), value); + } + Some(true) + } +} diff --git a/ferretro_components/src/provided/stdlib/variables/mod.rs b/ferretro_components/src/provided/stdlib/variables/mod.rs new file mode 100644 index 0000000..ebdf2b0 --- /dev/null +++ b/ferretro_components/src/provided/stdlib/variables/mod.rs @@ -0,0 +1,5 @@ +mod env; +mod store; + +pub use env::EnvironmentVariableComponent; +pub use store::VariableStoreComponent; diff --git a/ferretro_components/src/provided/stdlib/variables.rs b/ferretro_components/src/provided/stdlib/variables/store.rs similarity index 100% rename from ferretro_components/src/provided/stdlib/variables.rs rename to ferretro_components/src/provided/stdlib/variables/store.rs