use std::{env, path::Path};
use miette::IntoDiagnostic;
use strum_macros::{Display, EnumString};
use crate::{inline_string, ok, InlineString, SCRIPT_MOD_DEBUG};
#[cfg(target_os = "windows")]
const OS_SPECIFIC_ENV_PATH_SEPARATOR: &str = ";";
#[cfg(not(target_os = "windows"))]
const OS_SPECIFIC_ENV_PATH_SEPARATOR: &str = ":";
#[derive(Debug, Display, EnumString)]
pub enum EnvKeys {
#[strum(serialize = "PATH")]
Path,
}
pub type EnvVars = Vec<(String, String)>;
pub type EnvVarsSlice<'a> = &'a [(String, String)];
pub fn gen_path_env_vars(path_value: &str) -> EnvVars {
vec![(EnvKeys::Path.to_string(), path_value.to_string())]
}
pub fn try_get(key: EnvKeys) -> miette::Result<String> {
env::var(key.to_string()).into_diagnostic()
}
pub fn try_get_path_prefixed(
prefix_path: impl AsRef<Path>,
) -> miette::Result<InlineString> {
let path = try_get(EnvKeys::Path)?;
let add_to_path = inline_string!(
"{}{}{}",
prefix_path.as_ref().display(),
OS_SPECIFIC_ENV_PATH_SEPARATOR,
path
);
SCRIPT_MOD_DEBUG.then(|| {
tracing::debug!(
message = "try_get_path_prefixed",
add_to_path = %add_to_path
);
});
ok!(add_to_path)
}
#[cfg(test)]
mod tests_environment {
use super::*;
use crate::environment;
#[test]
fn test_try_get_path_from_env() {
let path = environment::try_get(EnvKeys::Path).unwrap();
assert!(!path.is_empty());
}
#[test]
fn test_try_get() {
let path = environment::try_get(EnvKeys::Path).unwrap();
assert!(!path.is_empty());
}
#[test]
fn test_get_path_envs() {
let path_envs = environment::gen_path_env_vars("/usr/bin");
let expected = vec![("PATH".to_string(), "/usr/bin".to_string())];
assert_eq!(path_envs, expected);
}
#[test]
fn test_get_path() {
let path = environment::try_get(EnvKeys::Path).unwrap();
assert!(!path.is_empty());
}
#[test]
fn test_get_path_prefixed() {
let prefix_path = "/usr/bin";
let path = environment::try_get_path_prefixed(prefix_path).unwrap();
assert!(!path.is_empty());
assert!(path.starts_with(prefix_path));
}
}