Skip to main content

sim_value/
capability.rs

1//! Capability-name readers for `Expr` data.
2
3use sim_kernel::{CapabilityName, Error, Expr, Result};
4
5/// Parses a nil, singleton symbol/string, list, or vector into capability names.
6///
7/// Symbols are rendered through their standard display form, so qualified
8/// symbols keep their namespace in the resulting capability name.
9pub 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}