use hcl::{eval::FuncArgs, Value};
type FnRes = Result<Value, String>;
pub fn yamldecode(args: FuncArgs) -> FnRes {
let args = args.iter().next().ok_or("No arguments provided")?;
serde_yml::from_str(&args.to_string()).map_err(|e| format!("Failed to deserialize YAML: {}", e))
}
pub fn yamlencode(args: FuncArgs) -> FnRes {
let args = args.iter().next().ok_or("No arguments provided")?;
Ok(Value::String(
serde_yml::to_string(&args.to_string())
.map_err(|e| format!("Failed to serialize YAML: {}", e))?,
))
}
pub fn env(args: FuncArgs) -> FnRes {
let args = args.iter().next().ok_or("No arguments provided")?;
let key = args.to_string();
std::env::var(key)
.map(Value::String)
.map_err(|e| format!("Failed to get environment variable: {}", e))
}
pub fn lower(args: FuncArgs) -> FnRes {
let args = args.iter().next().ok_or("No arguments provided")?;
Ok(Value::String(args.to_string().to_lowercase()))
}
pub fn upper(args: FuncArgs) -> FnRes {
let args = args.iter().next().ok_or("No arguments provided")?;
Ok(Value::String(args.to_string().to_uppercase()))
}
pub fn split(args: FuncArgs) -> FnRes {
let mut args = args.iter();
if args.len() != 2 {
return Err("Invalid number of arguments".to_string());
}
let sep = args.next().ok_or("No separator provided")?;
let sep = sep.to_string();
let args = args.next().ok_or("No arguments provided")?;
let args = args.to_string();
let splitted: Vec<Value> = args
.split(&sep)
.map(|s| Value::String(s.to_string()))
.collect();
Ok(Value::Array(splitted))
}
pub fn join(args: FuncArgs) -> FnRes {
let mut args = args.iter();
if args.len() != 2 {
return Err("Invalid number of arguments".to_string());
}
let sep = args.next().ok_or("No separator provided")?;
let sep = sep.to_string();
let args = args.next().ok_or("No arguments provided")?;
let args = args.as_array().unwrap_or_else(|| unreachable!());
let args: Vec<String> = args.iter().map(|s| s.to_string()).collect();
Ok(Value::String(args.join(&sep)))
}
pub fn strlen(args: FuncArgs) -> FnRes {
let args = args.iter().next().ok_or("No arguments provided")?;
let len = args.to_string().len();
Ok(len.into())
}