1use rkyv::{Archive, Deserialize, Serialize};
4use serde::{Deserialize as SerdeDeserialize, Serialize as SerdeSerialize};
5use std::collections::HashMap;
6use waremax_core::SkuId;
7
8#[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#[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}