Skip to main content

sim_lib_expr_tree/
citizen.rs

1use sim_citizen::CitizenRegistry;
2use sim_citizen_derive::Citizen;
3use sim_kernel::{Expr, Result, Symbol};
4
5/// Reconstructable authored source record.
6///
7/// This is data only. It intentionally carries no tree handle, writer lane,
8/// capability set, Table/Dir backend, calculator frame, or stream endpoint.
9#[derive(Clone, Debug, PartialEq, Citizen)]
10#[citizen(symbol = "expr-tree/SourceRecord", version = 1)]
11pub struct DurableSourceRecord {
12    /// Canonical absolute cell path.
13    pub path: String,
14    /// Exact authored expression.
15    pub source: Expr,
16    /// Monotone source revision observed by the runtime.
17    pub revision: u64,
18}
19
20impl Default for DurableSourceRecord {
21    fn default() -> Self {
22        Self {
23            path: "/cell-1".to_owned(),
24            source: Expr::Nil,
25            revision: 0,
26        }
27    }
28}
29
30/// Reconstructable durable calculation and codec policy record.
31///
32/// Capability ceilings remain live session authority and are never encoded in
33/// this record.
34#[derive(Clone, Debug, Default, PartialEq, Citizen)]
35#[citizen(symbol = "expr-tree/PolicyRecord", version = 1)]
36pub struct DurablePolicyRecord {
37    /// Canonical absolute policy owner path (`/` for tree policy).
38    pub path: String,
39    /// Stable trigger spelling: automatic, on-demand, manual, or frozen.
40    pub calc_trigger: String,
41    /// Optional installed source-codec symbol spelling.
42    pub source_codec: Option<String>,
43    /// Optional installed result-codec symbol spelling.
44    pub result_codec: Option<String>,
45}
46
47/// Class symbol for [`DurableSourceRecord`].
48pub fn durable_source_class_symbol() -> Symbol {
49    Symbol::qualified("expr-tree", "SourceRecord")
50}
51
52/// Class symbol for [`DurablePolicyRecord`].
53pub fn durable_policy_class_symbol() -> Symbol {
54    Symbol::qualified("expr-tree", "PolicyRecord")
55}
56
57/// Builds the explicit, dead-code-elimination-safe Citizen registry.
58pub fn expr_tree_citizen_registry() -> Result<CitizenRegistry> {
59    let mut registry = CitizenRegistry::new();
60    registry
61        .register::<DurableSourceRecord>()?
62        .register::<DurablePolicyRecord>()?;
63    Ok(registry)
64}