sim_lib_binding/
runtime.rs1use std::sync::Arc;
9
10use sim_kernel::{
11 AbiVersion, Cx, Export, Lib, LibManifest, LibTarget, Linker, Result, Symbol, Version,
12};
13
14use crate::let_form::LetForm;
15
16const BINDING_LIB_ID: &str = "binding";
17
18pub fn manifest_name() -> Symbol {
20 Symbol::qualified("sim", BINDING_LIB_ID)
21}
22
23pub struct BindingLib;
25
26impl Lib for BindingLib {
27 fn manifest(&self) -> LibManifest {
28 LibManifest {
29 id: manifest_name(),
30 version: Version(env!("CARGO_PKG_VERSION").to_owned()),
31 abi: AbiVersion { major: 0, minor: 1 },
32 target: LibTarget::HostRegistered,
33 requires: Vec::new(),
34 capabilities: Vec::new(),
35 exports: binding_exports(),
36 }
37 }
38
39 fn load(&self, cx: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> Result<()> {
40 linker.function_value(LetForm::symbol(), cx.factory().opaque(Arc::new(LetForm))?)?;
41 Ok(())
42 }
43}
44
45pub fn binding_exports() -> Vec<Export> {
47 vec![Export::Function {
48 symbol: LetForm::symbol(),
49 function_id: None,
50 }]
51}
52
53pub fn install_binding_lib(cx: &mut Cx) -> Result<()> {
56 if cx.registry().lib(&manifest_name()).is_some() {
57 return Ok(());
58 }
59 cx.load_lib(&BindingLib)?;
60 Ok(())
61}