Skip to main content

sim/runtime/
glasses.rs

1//! Glasses SDK facade, modeled install helper, and cookbook proof callables.
2//!
3//! The facade installs the shared DEVICE_3 base and XR stream lib, then exposes
4//! deterministic proofs over the spatial, Halo, co-use, voice-site, and BRIDGE
5//! review contracts. Provider modes only select already-linked host providers.
6
7use std::sync::Arc;
8
9use sim_kernel::{
10    AbiVersion, Cx, Dependency, Export, Lib, LibManifest, LibTarget, Linker, Result, Symbol,
11    Version,
12};
13
14mod asr_site;
15#[cfg(feature = "cookbook")]
16mod cookbook;
17mod proof_functions;
18mod proofs;
19
20pub use asr_site::modeled_asr_site_symbol;
21#[cfg(feature = "cookbook")]
22pub use cookbook::RECIPES;
23use proof_functions::{GlassesProofFunction, ProofKind, proof_function_symbol};
24pub use proofs::{
25    CoUseProof, HaloGlanceProof, ReviewInSpaceProof, TwoRateProof, VoiceSiteProof, prove_co_use,
26    prove_halo_glance, prove_review_in_space, prove_two_rate, prove_voice_site,
27};
28
29/// SDK install mode for the glasses stack.
30#[derive(Clone, Copy, Debug, PartialEq, Eq)]
31pub enum GlassesInstallMode {
32    /// Deterministic modeled sources and surfaces only.
33    Modeled,
34    /// Enable the Viture provider lane.
35    Viture,
36    /// Enable the Halo provider lane.
37    Halo,
38    /// Enable both provider lanes.
39    Both,
40}
41
42/// Host-registered lib that exposes glasses cookbook proofs and modeled ASR.
43pub struct GlassesStackLib;
44
45impl Lib for GlassesStackLib {
46    fn manifest(&self) -> LibManifest {
47        let mut exports = ProofKind::ALL
48            .into_iter()
49            .map(|kind| Export::Value {
50                symbol: proof_function_symbol(kind),
51            })
52            .collect::<Vec<_>>();
53        exports.push(Export::Site {
54            symbol: modeled_asr_site_symbol(),
55            runtime_id: None,
56        });
57        LibManifest {
58            id: glasses_stack_manifest_symbol(),
59            version: Version(env!("CARGO_PKG_VERSION").to_owned()),
60            abi: AbiVersion { major: 0, minor: 1 },
61            target: LibTarget::HostRegistered,
62            requires: vec![Dependency {
63                id: sim_lib_stream_xr::xr_stream_manifest_symbol(),
64                minimum_version: None,
65            }],
66            capabilities: Vec::new(),
67            exports,
68        }
69    }
70
71    fn load(&self, cx: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> Result<()> {
72        for kind in ProofKind::ALL {
73            linker.value(
74                proof_function_symbol(kind),
75                cx.factory()
76                    .opaque(Arc::new(GlassesProofFunction { kind }))?,
77            )?;
78        }
79        linker.site_value(
80            modeled_asr_site_symbol(),
81            cx.factory().opaque(Arc::new(asr_site::ModeledAsrSite))?,
82        )?;
83        Ok(())
84    }
85}
86
87/// Installs the shared device base, XR stream lib, and glasses SDK facade.
88pub fn install_glasses_stack(cx: &mut Cx, mode: GlassesInstallMode) -> Result<()> {
89    super::reference_device::install_device_base(cx)?;
90    sim_lib_stream_xr::install_xr_stream_lib(cx)?;
91    if matches!(mode, GlassesInstallMode::Viture | GlassesInstallMode::Both) {
92        ensure_viture_feature()?;
93    }
94    if matches!(mode, GlassesInstallMode::Halo | GlassesInstallMode::Both) {
95        ensure_halo_feature()?;
96    }
97    sim_lib_core::install_once(cx, &GlassesStackLib)?;
98    Ok(())
99}
100
101/// Returns the manifest id for the glasses SDK facade.
102pub fn glasses_stack_manifest_symbol() -> Symbol {
103    Symbol::qualified("glasses", "sdk")
104}
105
106#[cfg(feature = "glasses-viture")]
107fn ensure_viture_feature() -> Result<()> {
108    let _provider = sim_lib_stream_viture::VitureProvider::stub();
109    Ok(())
110}
111
112#[cfg(not(feature = "glasses-viture"))]
113fn ensure_viture_feature() -> Result<()> {
114    Err(sim_kernel::Error::Eval(
115        "Viture install requires the glasses-viture feature".to_owned(),
116    ))
117}
118
119#[cfg(feature = "glasses-halo")]
120fn ensure_halo_feature() -> Result<()> {
121    let _provider = sim_lib_stream_halo::halo_stub_provider();
122    Ok(())
123}
124
125#[cfg(not(feature = "glasses-halo"))]
126fn ensure_halo_feature() -> Result<()> {
127    Err(sim_kernel::Error::Eval(
128        "Halo install requires the glasses-halo feature".to_owned(),
129    ))
130}