use super::spec::{RigResourcesSpec, RigSpec};
use crate::expand;
pub fn expand_vars(rig: &RigSpec, input: &str) -> String {
expand::expand_with_tilde(input, |token| resolve_token(rig, token))
}
pub fn expand_resources(rig: &RigSpec) -> RigResourcesSpec {
let mut resources = rig.resources.clone();
resources.paths = resources
.paths
.iter()
.map(|path| expand_vars(rig, path))
.collect();
resources
}
fn resolve_token(rig: &RigSpec, token: &str) -> Option<String> {
if let Some(rest) = token.strip_prefix("components.") {
let (id, field) = rest.split_once('.')?;
if field != "path" {
return None;
}
let component = rig.components.get(id)?;
let expanded = shellexpand::tilde(&component.path).into_owned();
return Some(expanded);
}
if let Some(name) = token.strip_prefix("env.") {
return Some(std::env::var(name).unwrap_or_default());
}
None
}
#[cfg(test)]
#[path = "../../../tests/core/rig/expand_test.rs"]
mod expand_test;