use sim_kernel::{CapabilityName, Error, Expr, Result};
pub fn capability_names_from_expr(expr: &Expr) -> Result<Vec<CapabilityName>> {
match expr {
Expr::Nil => Ok(Vec::new()),
Expr::List(items) | Expr::Vector(items) => {
items.iter().map(capability_name_from_expr).collect()
}
Expr::Symbol(_) | Expr::String(_) => Ok(vec![capability_name_from_expr(expr)?]),
_ => Err(Error::TypeMismatch {
expected: "capability list",
found: "non-list",
}),
}
}
fn capability_name_from_expr(expr: &Expr) -> Result<CapabilityName> {
match expr {
Expr::Symbol(symbol) => Ok(CapabilityName::new(symbol.to_string())),
Expr::String(text) => Ok(CapabilityName::new(text.clone())),
_ => Err(Error::TypeMismatch {
expected: "capability symbol or string",
found: "non-capability",
}),
}
}