pub use oxdock_parser::{
OxDockType, TypeDescriptor, Value, ValuePayload, clone_boxed, clone_copy, clone_shared,
drop_boxed, drop_noop, drop_shared, eq_boxed, eq_inline, eq_shared, fmt_boxed, fmt_inline,
fmt_shared, load_inline, startup_descriptors, store_inline, type_anchor, unshare_boxed,
unshare_inline, unshare_shared,
};
use std::collections::HashMap;
use oxdock_process::ProcessManager;
use super::state::ExecState;
pub(super) fn startup_type_map() -> HashMap<String, &'static TypeDescriptor> {
startup_descriptors()
.into_iter()
.map(|(name, descriptor)| (name.to_string(), descriptor))
.collect()
}
impl<P: ProcessManager> ExecState<P> {
pub fn register_type(&mut self, descriptor: &'static TypeDescriptor) {
if let Some(live) = self.types.get(descriptor.name) {
if !std::ptr::eq(*live, descriptor) {
panic!(
"type name `{}` already registered for a different descriptor",
descriptor.name
);
}
return;
}
self.types.insert(descriptor.name.to_string(), descriptor);
}
pub fn is_known_type(&self, name: &str) -> bool {
self.types.contains_key(name)
}
pub fn describe_type(&self, name: &str) -> Option<&'static TypeDescriptor> {
self.types.get(name).copied()
}
pub fn type_names(&self) -> Vec<String> {
let mut names: Vec<String> = startup_descriptors()
.into_iter()
.map(|(name, _)| name.to_string())
.collect();
for name in self.types.keys() {
if !names.contains(&name.to_string()) {
names.push(name.clone());
}
}
names
}
}