pub mod registry;
mod session;
use std::any::Any;
use std::fmt::Debug;
use std::hash::Hasher;
pub use session::SessionGuard;
pub use session::SessionMut;
pub use session::VortexSession;
pub use session::VortexSessionVar;
#[derive(Debug, Clone, Copy, Default)]
struct UnknownPluginPolicy {
allow_unknown: bool,
}
impl SessionVar for UnknownPluginPolicy {
fn as_any(&self) -> &dyn Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
}
pub trait SessionExt: Sized + private::Sealed {
fn session(&self) -> VortexSession;
fn get<V: VortexSessionVar + Default>(&self) -> SessionGuard<'_, V>;
fn get_opt<V: VortexSessionVar>(&self) -> Option<SessionGuard<'_, V>>;
fn get_mut<V: VortexSessionVar + Default + Clone>(&self) -> SessionMut<'_, V>;
}
mod private {
pub trait Sealed {}
impl Sealed for super::VortexSession {}
}
pub trait SessionVar: Any + Send + Sync + Debug + 'static {
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
}
#[derive(Default)]
struct IdHasher(u64);
impl Hasher for IdHasher {
#[inline]
fn finish(&self) -> u64 {
self.0
}
fn write(&mut self, _: &[u8]) {
unreachable!("TypeId calls write_u64");
}
#[inline]
fn write_u64(&mut self, id: u64) {
self.0 = id;
}
}
#[cfg(test)]
mod tests {
use super::VortexSession;
#[test]
fn allow_unknown_flag_is_opt_in() {
let session = VortexSession::empty();
assert!(!session.allows_unknown());
let session = session.allow_unknown();
assert!(session.allows_unknown());
}
}