entity_rust 0.0.8

Event driven CES framework for Rust with a macro DSL
Documentation
#[macro_export]
macro_rules! static_any_vec_map {
	($v:ident, $t:ty) => {
		pub mod $v {
			use std::collections::{ HashMap };
			use std::iter::FromIterator;
			use std::any::Any;
			use shared_mutex::{ SharedMutex, MappedSharedMutexReadGuard };

			lazy_static! {
				pub static ref MAP: SharedMutex<HashMap<$t, Box<Any+'static+Sync>>> = SharedMutex::new(HashMap::new());
			}

			pub fn push<T>(event_name: & $t, event: T) where T: Any+'static+Sync {
				let mut map = MAP.write().expect("Static MAP is not initialized.");
				let mut entry = map.entry(event_name.clone()).or_insert(Box::new(Vec::<T>::new()));
				let mut casted_entry = &mut **entry as &mut Any;
				let mut vec = casted_entry.downcast_mut::<Vec<T>>().expect("Could not cast created entry to Vec<T>");
				vec.push(event);
			}

			pub fn get<T>(event_name: & $t) -> MappedSharedMutexReadGuard<Vec<T>> where T: Any+'static+Sync {
				let map = MAP.read().expect("Static MAP is not initialized.");
				let vec = map.into_mapped().map(|m| {
					let entry = m.get(event_name).expect("Could not get a particular MAP entry.");
					let casted_entry = & **entry as & Any;
					return casted_entry.downcast_ref::<Vec<T>>().expect("Could not cast gotten entry to Vec<T>");
				});
				return vec;
			}

			pub fn clear<T>(event_name: & $t) where T: Any+'static+Sync {
				let mut map = MAP.write().expect("Static MAP is not initialized.");
				let mut entry = map.entry(event_name.clone()).or_insert(Box::new(Vec::<T>::new()));
				let mut casted_entry = &mut **entry as &mut Any;
				let mut vec = casted_entry.downcast_mut::<Vec<T>>().expect("Could not cast created entry to Vec<T>");
				vec.clear();
			}

			pub fn drain<'a>() -> Vec<($t, Box<Any+'static+Sync>)> {
				let mut map = MAP.write().expect("Static MAP is not initialized.");
				return Vec::from_iter(map.drain());
			}

			pub fn clear_all() {
				let mut map = MAP.write().expect("Static MAP is not initialized.");
				map.clear();
			}
		}
	}
}