use hashbrown::HashMap; use crate::static_data::DataLibrary; use crate::static_data::Item; use crate::StringKey; #[derive(Debug)] pub struct ItemLibrary { map: HashMap>, list: Vec, } impl ItemLibrary { pub fn new(capacity: usize) -> ItemLibrary { ItemLibrary { map: HashMap::with_capacity(capacity), list: Vec::with_capacity(capacity), } } } impl DataLibrary<'_, Box> for ItemLibrary { 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 hashbrown::HashSet; use crate::static_data::libraries::data_library::DataLibrary; use crate::static_data::libraries::item_library::ItemLibrary; use crate::static_data::Item; use crate::static_data::{BattleItemCategory, ItemCategory}; fn build_item() -> Item { Item::new( &"foo".into(), ItemCategory::MiscItem, BattleItemCategory::MiscBattleItem, 100, HashSet::new(), ) } pub fn build() -> ItemLibrary { let mut lib = ItemLibrary::new(1); let m = build_item(); // Borrow as mut so we can insert let w = &mut lib; w.add(&"foo".into(), Box::from(m)); // Drops borrow as mut lib } }