1use 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#[derive(Clone, Copy, Debug, PartialEq, Eq)]
31pub enum GlassesInstallMode {
32 Modeled,
34 Viture,
36 Halo,
38 Both,
40}
41
42pub 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
87pub 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
101pub 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}