Skip to main content

sim_lib_view/
cookbook.rs

1//! Deterministic cookbook builders for view recipes.
2
3use sim_kernel::{Expr, Symbol};
4use sim_value::build;
5
6use crate::surface::SurfaceCaps;
7use crate::{Mode, UNIVERSAL_EDITOR_ID, UNIVERSAL_VIEW_ID, universal_scene};
8
9/// Build a modeled universal view/editor descriptor for the cookbook.
10pub fn universal_lens_demo() -> Expr {
11    let value = build::map(vec![
12        (
13            "class",
14            Expr::Symbol(Symbol::qualified("demo", "ViewValue")),
15        ),
16        ("title", build::text("Universal lens sample")),
17    ]);
18    let surface = SurfaceCaps::from_preset("webui", "cookbook.web")
19        .expect("webui is a built-in surface preset");
20    let scene = universal_scene(&value, Mode::Builder);
21    debug_assert!(sim_lib_scene::validate_scene(&scene).is_ok());
22    build::map(vec![
23        ("surface", surface.to_expr()),
24        ("view-lens", Expr::Symbol(Symbol::new(UNIVERSAL_VIEW_ID))),
25        (
26            "editor-lens",
27            Expr::Symbol(Symbol::new(UNIVERSAL_EDITOR_ID)),
28        ),
29        ("scene", scene),
30    ])
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36    use sim_value::access;
37
38    #[test]
39    fn universal_lens_demo_carries_surface_caps_and_valid_scene() {
40        let demo = universal_lens_demo();
41        let surface = access::field(&demo, "surface").expect("surface descriptor");
42        SurfaceCaps::from_expr(surface).expect("surface caps parse");
43        let scene = access::field(&demo, "scene").expect("scene");
44        sim_lib_scene::validate_scene(scene).expect("scene validates");
45    }
46}