1use sim_citizen_derive::Citizen;
6use sim_kernel::{Error, Expr, Result, Symbol};
7
8#[derive(Clone, Debug, Default, PartialEq, Citizen)]
11#[citizen(symbol = "list/ConsList", version = 0)]
12pub struct ConsListDescriptor {
13 #[citizen(with = "crate::citizen::expr_items")]
15 pub items: Vec<Expr>,
16}
17
18pub fn cons_list_class_symbol() -> Symbol {
20 Symbol::qualified("list", "ConsList")
21}
22
23pub(crate) mod expr_items {
24 use super::*;
25
26 pub fn encode(items: &[Expr]) -> Expr {
27 Expr::List(items.to_vec())
28 }
29
30 pub fn decode(expr: &Expr) -> Result<Vec<Expr>> {
31 let Expr::List(items) = expr else {
32 return Err(Error::Eval(
33 "list citizen field items: expected list".to_owned(),
34 ));
35 };
36 Ok(items.clone())
37 }
38}