Skip to main content

sim_lib_auto_core/
read_construct.rs

1//! Helpers for explicit citizen read-construct expression forms.
2
3use sim_kernel::{Expr, Symbol};
4
5use crate::VehicleId;
6
7/// Builds the explicit read-construct expression for a modeled vehicle id.
8pub fn vehicle_read_construct(vehicle: &VehicleId) -> Expr {
9    read_construct_expr(
10        vehicle_class_symbol(),
11        vec![
12            Expr::Symbol(Symbol::new("v0")),
13            Expr::String(vehicle.namespace.clone()),
14            Expr::String(vehicle.key.clone()),
15        ],
16    )
17}
18
19/// Builds a `citizen/read-construct` extension from class text and arguments.
20pub fn text_read_construct_expr(class: &str, args: Vec<Expr>) -> Expr {
21    read_construct_expr(symbol_text(class), args)
22}
23
24/// Builds a `citizen/read-construct` extension from a class symbol and arguments.
25pub fn read_construct_expr(class: Symbol, args: Vec<Expr>) -> Expr {
26    Expr::Extension {
27        tag: Symbol::qualified("citizen", "read-construct"),
28        payload: Box::new(Expr::Vector(
29            std::iter::once(Expr::Symbol(class)).chain(args).collect(),
30        )),
31    }
32}
33
34fn vehicle_class_symbol() -> Symbol {
35    Symbol::qualified("auto", "VehicleId")
36}
37
38fn symbol_text(text: &str) -> Symbol {
39    if let Some((namespace, name)) = text.split_once('/') {
40        Symbol::qualified(namespace, name)
41    } else {
42        Symbol::new(text)
43    }
44}