use std::sync::Arc; use indexmap::IndexMap; use crate::static_data::Ability; use crate::static_data::DataLibrary; use crate::StringKey; /// A storage for all abilities that can be used in this data library. #[derive(Debug)] pub struct AbilityLibrary { /// The underlying map for the library. map: IndexMap>, } impl AbilityLibrary { /// Instantiates a new ability library. pub fn new(capacity: usize) -> AbilityLibrary { AbilityLibrary { map: IndexMap::with_capacity(capacity), } } } impl DataLibrary<'_, Ability> for AbilityLibrary { fn map(&self) -> &IndexMap> { &self.map } fn get_modify(&mut self) -> &mut IndexMap> { &mut self.map } } #[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".into()), 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 ability = lib.get(&"test_ability".into()); assert!(ability.is_some()); assert_eq!(ability.unwrap().name(), &"test_ability".into()); } }