use crate::*;
use once_cell::sync::Lazy;
use std::sync::{PoisonError, RwLock, RwLockReadGuard};
static TYPES: Lazy<RwLock<TypeMap>> = Lazy::new(Default::default);
pub struct TypesIter {
index: usize,
lock: RwLockReadGuard<'static, TypeMap>,
}
impl Iterator for TypesIter {
type Item = (SpectaID, NamedDataType);
fn next(&mut self) -> Option<Self::Item> {
let (k, v) = self.lock.map.iter().nth(self.index)?;
self.index += 1;
Some((
*k,
v.clone()
.expect("specta: `TypesIter` found a type placeholder!"),
))
}
}
pub fn get_types() -> TypesIter {
let types = TYPES.read().unwrap_or_else(PoisonError::into_inner);
TypesIter {
index: 0,
lock: types,
}
}
#[doc(hidden)]
pub fn register_ty<T: Type>() {
let type_map = &mut *TYPES.write().unwrap_or_else(PoisonError::into_inner);
T::reference(type_map, &[]);
}