/ src / backend / src / item / image.rs
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  }