image.rs
1 use candid::{CandidType, Deserialize}; 2 use interface::item::ImageData; 3 use std::collections::BTreeMap; 4 5 type ImageKey = u8; 6 7 pub type ImageVecKey = u32; 8 9 #[derive(CandidType, Deserialize, Debug, Clone)] 10 pub struct ItemImages { 11 // Actual data of images 12 pub map: BTreeMap<ImageKey, ImageData>, 13 // Mapping of image groups to keys 14 pub vec_map: BTreeMap<ImageVecKey, Vec<ImageKey>>, 15 } 16 17 impl ItemImages { 18 pub fn new_str(images: Vec<(&str, &str)>, vec: Vec<Vec<ImageKey>>) -> Self { 19 let map = images 20 .into_iter() 21 .enumerate() 22 .map(|(i, image)| (i as ImageKey, ImageData::new_str(image.0, image.1))) 23 .collect::<BTreeMap<_, _>>(); 24 25 let vec_map = vec 26 .into_iter() 27 .enumerate() 28 .map(|(i, image_vec)| (i as ImageVecKey, image_vec)) 29 .collect::<BTreeMap<_, _>>(); 30 31 Self { map, vec_map } 32 } 33 34 pub fn get_base_image(&self, key: &ImageVecKey) -> Option<&ImageData> { 35 let image_key = self.vec_map.get(key)?[0]; 36 self.map.get(&image_key) 37 } 38 39 pub fn get_image_vec(&self, key: &ImageVecKey) -> Option<Vec<ImageData>> { 40 let image_vec = self.vec_map.get(key)?; 41 let mut images = Vec::new(); 42 for image_key in image_vec { 43 images.push(self.map.get(image_key)?.clone()); 44 } 45 Some(images) 46 } 47 } 48 49 impl Default for ItemImages { 50 fn default() -> Self { 51 Self { 52 map: BTreeMap::new(), 53 vec_map: BTreeMap::new(), 54 } 55 } 56 }