Skip to main content

sim_relation_site/
lib.rs

1//! Bounded, provider-neutral relation effects.
2#![forbid(unsafe_code)]
3#![deny(missing_docs)]
4
5mod contract;
6mod site;
7
8pub use contract::*;
9pub use site::RelationSite;
10#[cfg(test)]
11pub(crate) use site::{BoundedSink, Counts, enforce_work, kernel};
12
13use std::sync::Arc;
14
15use sim_kernel::{
16    AbiVersion, ClassId, Cx, Export, Factory, Lib, LibManifest, LibTarget, Linker,
17    Result as KernelResult, Symbol, Version,
18};
19
20/// Loadable relation-site library.
21pub struct RelationSiteLib {
22    site: RelationSite,
23}
24impl RelationSiteLib {
25    /// Creates a library exporting `site`.
26    pub fn new(site: RelationSite) -> Self {
27        Self { site }
28    }
29}
30impl Lib for RelationSiteLib {
31    fn manifest(&self) -> LibManifest {
32        LibManifest {
33            id: Symbol::qualified("relation", "site-lib"),
34            version: Version(env!("CARGO_PKG_VERSION").into()),
35            abi: AbiVersion { major: 0, minor: 1 },
36            target: LibTarget::HostRegistered,
37            requires: Vec::new(),
38            capabilities: Vec::new(),
39            exports: vec![Export::Site {
40                symbol: self.site.placement.site.clone(),
41                runtime_id: None,
42            }],
43        }
44    }
45    fn load(&self, _: &mut sim_kernel::LoadCx, linker: &mut Linker<'_>) -> KernelResult<()> {
46        linker.site_value(
47            self.site.placement.site.clone(),
48            sim_kernel::DefaultFactory.opaque(Arc::new(RelationSite::new(
49                self.site.placement.clone(),
50                self.site.driver.clone(),
51            )))?,
52        )?;
53        Ok(())
54    }
55}
56
57impl sim_kernel::Object for RelationSite {
58    fn display(&self, _: &mut Cx) -> KernelResult<String> {
59        Ok(format!("#<relation-site {}>", self.placement.site))
60    }
61    fn as_any(&self) -> &dyn std::any::Any {
62        self
63    }
64}
65impl sim_kernel::ObjectCompat for RelationSite {
66    fn class(&self, cx: &mut Cx) -> KernelResult<sim_kernel::ClassRef> {
67        cx.factory()
68            .class_stub(ClassId(0), Symbol::qualified("relation", "Site"))
69    }
70}
71
72#[cfg(test)]
73mod sqlite_locator_tests;
74#[cfg(test)]
75mod tests;