#[cfg(target_arch = "wasm32")]
use crate::js_runtime;
use crate::prelude::GlobFilter;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum EnvError {
#[error("Environment variable not found: {0}")]
NotFound(String),
}
pub fn var(key: &str) -> Result<String, EnvError> {
#[cfg(not(target_arch = "wasm32"))]
{
return std::env::var(key)
.map_err(|_| EnvError::NotFound(key.to_string()));
}
#[cfg(target_arch = "wasm32")]
{
return js_runtime::env_var(key)
.ok_or_else(|| EnvError::NotFound(key.to_string()));
}
}
pub fn vars() -> Vec<(String, String)> {
#[cfg(not(target_arch = "wasm32"))]
{
return std::env::vars().collect();
}
#[cfg(target_arch = "wasm32")]
{
use js_sys::Array;
let entries = js_runtime::env_all();
let mut out: Vec<(String, String)> = Vec::new();
let len = entries.length();
for i in 0..len {
let pair = Array::from(&entries.get(i));
let key = pair.get(0).as_string().unwrap();
let value = pair.get(1).as_string().unwrap();
out.push((key, value));
}
return out;
}
}
pub fn vars_filtered(filter: GlobFilter) -> Vec<(String, String)> {
vars()
.into_iter()
.filter(|(key, _)| filter.passes(key))
.collect()
}