1use sim_kernel::{CapabilityName, Error, Expr, Result};
4
5pub fn capability_names_from_expr(expr: &Expr) -> Result<Vec<CapabilityName>> {
10 match expr {
11 Expr::Nil => Ok(Vec::new()),
12 Expr::List(items) | Expr::Vector(items) => {
13 items.iter().map(capability_name_from_expr).collect()
14 }
15 Expr::Symbol(_) | Expr::String(_) => Ok(vec![capability_name_from_expr(expr)?]),
16 _ => Err(Error::TypeMismatch {
17 expected: "capability list",
18 found: "non-list",
19 }),
20 }
21}
22
23fn capability_name_from_expr(expr: &Expr) -> Result<CapabilityName> {
24 match expr {
25 Expr::Symbol(symbol) => Ok(CapabilityName::new(symbol.to_string())),
26 Expr::String(text) => Ok(CapabilityName::new(text.clone())),
27 _ => Err(Error::TypeMismatch {
28 expected: "capability symbol or string",
29 found: "non-capability",
30 }),
31 }
32}