1#![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
20pub struct RelationSiteLib {
22 site: RelationSite,
23}
24impl RelationSiteLib {
25 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;