pub( crate ) mod private
{
use once_cell::sync::Lazy;
use std::sync::Mutex;
use dashmap::DashMap;
static mut CONTEXTS : Lazy< DashMap< String, Context > > = Lazy::new( ||
{
DashMap::new()
});
static mut CURRENT_CONTEXT : Lazy< Mutex< Option< String > > > = Lazy::new( ||
{
Mutex::new( None )
});
#[ derive( Debug, Clone, Copy ) ]
pub struct ContextId
{
#[ allow( dead_code ) ]
tp_id : i32,
#[ allow( dead_code ) ]
in_id : i32,
}
#[ derive( Debug, Clone ) ]
pub struct Context
{
id : ContextId,
}
impl Context
{
fn _new() -> Self
{
let id = ContextId { tp_id : 1, in_id : 1 };
Self
{
id
}
}
pub fn id( &self ) -> ContextId
{
self.id
}
}
pub fn current() -> Context
{
unsafe
{
let current_name : Option< String > = CURRENT_CONTEXT.lock().unwrap().clone();
if current_name.is_none()
{
make()
}
else
{
( *CONTEXTS.get( ¤t_name.unwrap() ).unwrap().value() ).clone()
}
}
}
pub fn make() -> Context
{
unsafe
{
let mut current_name : Option< String > = CURRENT_CONTEXT.lock().unwrap().clone();
if current_name.is_none()
{
current_name = Some( "default".into() )
}
let current_name = current_name.unwrap();
if CONTEXTS.contains_key( ¤t_name )
{
( *CONTEXTS.get( ¤t_name ).unwrap().value() ).clone()
}
else
{
let context = Context::_new();
CONTEXTS.insert( current_name.clone(), context );
( *CONTEXTS.get( ¤t_name ).unwrap().value() ).clone()
}
}
}
}
pub mod protected
{
pub use super::
{
orphan::*,
private::current,
private::make,
};
}
pub use protected::*;
pub mod orphan
{
pub use super::exposed::*;
}
pub mod exposed
{
pub use super::
{
prelude::*,
private::current as context,
};
}
pub use exposed::*;
pub mod prelude
{
pub use super::private::
{
};
}