#![allow(dead_code, unused)]
use crate::info::*;
use std::collections::BTreeMap;
use std::sync::RwLock;
static REFLECTED_TRAITS: RwLock<HashMap<String, Box<Trait>>> = RwLock::new(BTreeMap::new());
#[derive(Debug)]
struct Trait {
name: String,
bounds: fn() -> Vec<Trait>,
methods: fn() -> Vec< ()>,
}
impl Trait {
fn add_trait(tr: Trait) {
let mut map = REFLECTED_TRAITS
.get_or_init(|| RwLock::new(HashMap::new()))
.write()
.expect("REFLECTED_TRAITS not initialized correctly");
let name = tr.name();
if map.contains_key(name) {
panic!("Trait {} already registered", name);
}
map.insert(name.clone(), Box::new(tr));
}
pub unsafe fn new_trait(
name: String,
bounds: fn() -> Vec<Trait>,
methods: fn() -> Vec< ()>,
) -> Trait {
Trait {
name,
bounds,
methods,
}
}
pub fn name(&self) -> &String {
&self.name
}
pub fn bounds(&self) -> Vec<Trait> {
(self.bounds)()
}
}