diff --git a/src/error.rs b/src/error.rs index ab6c575..2cf0546 100644 --- a/src/error.rs +++ b/src/error.rs @@ -77,6 +77,9 @@ pub enum ErrorKind { #[fail(display = "Error loading preset \"{}\"", _0)] Preset(String), + #[fail(display = "Missing environment variables \"{:?}\"", _0)] + MissingEnvironmentVariables(Vec), + #[fail(display = "Error executing preset script")] PresetScript, } diff --git a/src/presets.rs b/src/presets.rs index ed32593..01b4b15 100644 --- a/src/presets.rs +++ b/src/presets.rs @@ -2,6 +2,7 @@ use crate::error::{Error, ErrorKind}; use failure::ResultExt; use serde::Deserialize; use std::collections::HashSet; +use std::env; use std::fs; use std::path::{Path, PathBuf}; use toml; @@ -11,6 +12,7 @@ use toml; struct Preset { packages: Option>, script: Option, + environment_variables: Option>, } impl Preset { @@ -31,20 +33,35 @@ impl Presets { pub fn load(list: &[PathBuf]) -> Result { let mut packages = HashSet::new(); let mut scripts = Vec::new(); + let mut environment_variables = HashSet::new(); for preset in list { let Preset { script, packages: preset_packages, + environment_variables: preset_environment_variables, } = Preset::load(&preset)?; if let Some(preset_packages) = preset_packages { packages.extend(preset_packages); } + if let Some(preset_environment_variables) = preset_environment_variables { + environment_variables.extend(preset_environment_variables); + } + scripts.extend(script); } + let missing_envrionments: Vec = environment_variables + .into_iter() + .filter(|var| env::var(var).is_err()) + .collect(); + + if !missing_envrionments.is_empty() { + Err(ErrorKind::MissingEnvironmentVariables(missing_envrionments))? + } + Ok(Self { packages, scripts }) } }