Skip to main content

waremax_storage/
sku.rs

1//! SKU definitions and catalog
2
3use rkyv::{Archive, Deserialize, Serialize};
4use serde::{Deserialize as SerdeDeserialize, Serialize as SerdeSerialize};
5use std::collections::HashMap;
6use waremax_core::SkuId;
7
8/// SKU (Stock Keeping Unit) definition
9#[derive(Archive, Deserialize, Serialize, SerdeDeserialize, SerdeSerialize, Clone, Debug)]
10pub struct Sku {
11    pub id: SkuId,
12    pub string_id: String,
13    pub unit_pick_time_s: f64,
14    pub weight_kg: Option<f64>,
15}
16
17impl Sku {
18    pub fn new(id: SkuId, string_id: String, unit_pick_time_s: f64) -> Self {
19        Self {
20            id,
21            string_id,
22            unit_pick_time_s,
23            weight_kg: None,
24        }
25    }
26}
27
28/// Catalog of all SKUs
29#[derive(Clone, Default)]
30pub struct SkuCatalog {
31    skus: HashMap<SkuId, Sku>,
32    string_to_id: HashMap<String, SkuId>,
33}
34
35impl SkuCatalog {
36    pub fn new() -> Self {
37        Self::default()
38    }
39
40    pub fn add(&mut self, sku: Sku) {
41        let id = sku.id;
42        let string_id = sku.string_id.clone();
43        self.skus.insert(id, sku);
44        self.string_to_id.insert(string_id, id);
45    }
46
47    pub fn get(&self, id: SkuId) -> Option<&Sku> {
48        self.skus.get(&id)
49    }
50
51    pub fn by_string(&self, s: &str) -> Option<SkuId> {
52        self.string_to_id.get(s).copied()
53    }
54
55    pub fn count(&self) -> usize {
56        self.skus.len()
57    }
58
59    pub fn iter(&self) -> impl Iterator<Item = &Sku> {
60        self.skus.values()
61    }
62
63    pub fn ids(&self) -> impl Iterator<Item = SkuId> + '_ {
64        self.skus.keys().copied()
65    }
66}