Skip to main content

openfare_lib/api/services/
basket.rs

1pub type ExtensionName = String;
2
3#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
4pub struct Item {
5    pub package: crate::package::Package,
6    pub extension_name: ExtensionName,
7    pub plans: std::collections::BTreeMap<String, crate::lock::plan::Plan>,
8    pub total_price: crate::price::Price,
9    pub payees: crate::lock::payee::Payees,
10}
11
12impl Item {
13    pub fn plan_payees(&self, plan_id: &str) -> Option<crate::lock::payee::Payees> {
14        let plan = self.plans.get(plan_id);
15        if let Some(plan) = plan {
16            if let Some(shares) = &plan.payments.shares {
17                let payee_labels = shares
18                    .iter()
19                    .map(|(label, _)| label)
20                    .collect::<std::collections::BTreeSet<_>>();
21                let payees = self
22                    .payees
23                    .iter()
24                    .filter(|(label, _payee)| payee_labels.contains(label))
25                    .map(|(label, payee)| (label.clone(), payee.clone()))
26                    .collect();
27                Some(payees)
28            } else {
29                // If shares unspecified, all payees are applicable.
30                Some(self.payees.clone())
31            }
32        } else {
33            None
34        }
35    }
36}