Skip to main content

rivet_cli/config/
resolve.rs

1/// Replaces `${VAR}` patterns with values from `params` (if provided) or environment variables.
2/// Params take precedence over env vars.
3pub fn resolve_vars(
4    input: &str,
5    params: Option<&std::collections::HashMap<String, String>>,
6) -> String {
7    let mut result = input.to_string();
8    while let Some(start) = result.find("${") {
9        if let Some(end) = result[start..].find('}') {
10            let var_name = &result[start + 2..start + end];
11            let value = params
12                .and_then(|p| p.get(var_name).cloned())
13                .unwrap_or_else(|| std::env::var(var_name).unwrap_or_default());
14            result = format!(
15                "{}{}{}",
16                &result[..start],
17                value,
18                &result[start + end + 1..]
19            );
20        } else {
21            break;
22        }
23    }
24    result
25}
26
27/// Convenience wrapper: resolve `${VAR}` from environment only.
28pub fn resolve_env_vars(input: &str) -> String {
29    resolve_vars(input, None)
30}
31
32/// Parse a human-readable file size like "512MB", "1GB", "100KB" into bytes.
33pub fn parse_file_size(s: &str) -> crate::error::Result<u64> {
34    let s = s.trim().to_uppercase();
35    let (num, multiplier) = if let Some(n) = s.strip_suffix("GB") {
36        (n.trim(), 1024u64 * 1024 * 1024)
37    } else if let Some(n) = s.strip_suffix("MB") {
38        (n.trim(), 1024u64 * 1024)
39    } else if let Some(n) = s.strip_suffix("KB") {
40        (n.trim(), 1024u64)
41    } else if let Some(n) = s.strip_suffix('B') {
42        (n.trim(), 1u64)
43    } else {
44        (s.as_str(), 1u64)
45    };
46    let value: f64 = num
47        .parse()
48        .map_err(|_| anyhow::anyhow!("invalid file size: '{}'", s))?;
49    Ok((value * multiplier as f64) as u64)
50}