sim_lib_server/
registries.rs1use sim_kernel::{Cx, Error, Result, Symbol};
2use std::{
3 collections::BTreeMap,
4 sync::{Arc, Mutex, OnceLock},
5};
6
7use crate::{EvalSite, LineDriver, ServerAddress};
8
9pub struct ResolvedAddress {
11 pub site: Arc<dyn EvalSite>,
13 pub selected_codec: Symbol,
15 pub supported_codecs: Vec<Symbol>,
17}
18
19pub type AddressResolver =
21 fn(&mut Cx, &ServerAddress, &[Symbol]) -> Result<Option<ResolvedAddress>>;
22pub type LineDriverFactory = fn(&mut Cx, &sim_kernel::Expr) -> Result<Option<Box<dyn LineDriver>>>;
24
25pub(crate) fn address_resolvers() -> &'static Mutex<BTreeMap<String, AddressResolver>> {
26 static RESOLVERS: OnceLock<Mutex<BTreeMap<String, AddressResolver>>> = OnceLock::new();
27 RESOLVERS.get_or_init(|| Mutex::new(BTreeMap::new()))
28}
29
30pub(crate) fn line_driver_factories() -> &'static Mutex<BTreeMap<String, LineDriverFactory>> {
31 static FACTORIES: OnceLock<Mutex<BTreeMap<String, LineDriverFactory>>> = OnceLock::new();
32 FACTORIES.get_or_init(|| Mutex::new(BTreeMap::new()))
33}
34
35pub fn register_address_resolver(kind: Symbol, resolver: AddressResolver) -> Result<()> {
37 let mut resolvers = address_resolvers()
38 .lock()
39 .map_err(|_| Error::HostError("address resolver registry mutex poisoned".to_owned()))?;
40 resolvers.insert(kind.to_string(), resolver);
41 Ok(())
42}
43
44pub fn register_line_driver(name: Symbol, factory: LineDriverFactory) -> Result<()> {
46 let mut factories = line_driver_factories()
47 .lock()
48 .map_err(|_| Error::HostError("line driver registry mutex poisoned".to_owned()))?;
49 factories.insert(name.to_string(), factory);
50 Ok(())
51}