use hashbrown::HashMap; use crate::static_data::Ability; use crate::static_data::DataLibrary; use crate::StringKey; #[derive(Debug)] pub struct AbilityLibrary { map: HashMap>, list: Vec, } impl AbilityLibrary { pub fn new(capacity: usize) -> AbilityLibrary { AbilityLibrary { map: HashMap::with_capacity(capacity), list: Vec::with_capacity(capacity), } } } impl DataLibrary<'_, Box> for AbilityLibrary { fn map(&self) -> &HashMap> { &self.map } fn list_values(&self) -> &Vec { &self.list } fn get_modify(&mut self) -> (&mut HashMap>, &mut Vec) { (&mut self.map, &mut self.list) } } #[cfg(test)] pub mod tests { use crate::static_data::Ability; use crate::static_data::AbilityLibrary; use crate::static_data::DataLibrary; use crate::StringKey; pub fn build() -> AbilityLibrary { let mut lib = AbilityLibrary::new(1); lib.add( &StringKey::new("test_ability"), Box::new(Ability::new(&"test_ability".into(), &"test_ability".into(), Vec::new())), ); // Drops borrow as mut lib } #[test] fn get_ability_library_access() { let lib = build(); let ability = lib.get(&"test_ability".into()); assert!(ability.is_some()); assert_eq!(ability.unwrap().name(), &"test_ability".into()); } #[test] fn get_ability_library_direct_map_access() { let lib = build(); let map = lib.map(); let ability = map.get(&"test_ability".into()); assert!(ability.is_some()); assert_eq!(ability.unwrap().name(), &"test_ability".into()); } #[test] fn get_ability_library_direct_list_access() { let lib = build(); let list = lib.list_values(); assert_eq!(list.len(), 1); assert!(list.contains(&StringKey::new("test_ability"))); } }