| Crates.io | rush-var |
| lib.rs | rush-var |
| version | 0.1.1 |
| created_at | 2025-07-27 10:38:16.895807+00 |
| updated_at | 2025-07-27 10:38:16.895807+00 |
| description | Expand shell-style variables like $FOO and ${BAR:-default} recursively |
| homepage | |
| repository | https://github.com/BppleMan/rush-env |
| max_upload_size | |
| id | 1769904 |
| size | 17,976 |
A recursive shell-style variable interpolator for Rust, supporting $VAR, ${VAR}, and ${VAR:-default} patterns.
$FOO, ${FOO}, ${FOO:-default}${VAR:-default}std::env)Add this to your Cargo.toml:
[dependencies]
rush-var = "0.1"
use rush_var::expand_env;
let env = [("FOO", "bar")];
assert_eq!(expand_env("Hello $FOO!", &env), "Hello bar!");
assert_eq!(expand_env("path=${BAR:-/usr/local}/bin", &env), "path=/usr/local/bin");
use std::collections::HashMap;
use rush_var::expand_env_recursive;
let mut env = HashMap::new();
env.insert("A".into(), "$B".into());
env.insert("B".into(), "value".into());
assert_eq!(expand_env_recursive("A=$A", &env), "A=value");
use rush_var::env_source::FnEnvSource;
use rush_var::expand_env;
let env = FnEnvSource( | key: & str| {
match key {
"USER" => Some("alice".to_string()),
_ => None,
}
});
assert_eq!(expand_env("hi_$USER", &env), "hi_alice");
use rush_var::env_source::EnvSourceChain;
use rush_var::expand_env;
use std::collections::HashMap;
let main = [("FOO", "123")];
let mut fallback = HashMap::new();
fallback.insert("BAR".to_string(), "456".to_string());
let chain = EnvSourceChain {
primary: & main[..],
fallback: & fallback,
};
assert_eq!(expand_env("$FOO,$BAR", &chain), "123,456");
use rush_var::expand_env_vars;
std::env::set_var("FOO", "system");
assert_eq!(expand_env_vars(">> $FOO <<"), ">> system <<");
pub fn expand_env(input: &str, env: &impl EnvSource) -> String
$VAR, ${VAR}, ${VAR:-default}, $$env can be any source implementing EnvSource trait (e.g., HashMap, slice, closure, etc.)pub fn expand_env_recursive(input: &str, env: &impl EnvSource) -> String
pub fn expand_env_vars(input: &str) -> String
std::env::vars() as the environment sourceexpand_env_recursive(input, &std::env::vars())| Syntax | Meaning |
|---|---|
$VAR |
Expand variable VAR if present, else empty string |
${VAR} |
Same as $VAR |
${VAR:-default} |
Use default if VAR is undefined |
$$ |
Literal dollar sign $ |
$VAR/$UNKNOWN |
Unknown variable expands to empty string |
${VAR:-/path} |
Default value can include any characters, even / |
${FOO:-$BAR} |
Default itself can contain variables (recursively expanded) |
$VAR_with_trailing! |
Stops at first non-alphanumeric/underscore character |
| Syntax | Status | Notes |
|---|---|---|
${VAR:+alt} |
❌ | Alternate value if defined |
${#VAR} |
❌ | Length of value |
${VAR/sub/repl} |
❌ | Substring replacement |
Error.Licensed under the Apache License, Version 2.0 (LICENSE or http://www.apache.org/licenses/LICENSE-2.0).
Made with ❤️ by [BppleMan]