discount.rs (1987B)
1 #[cfg(not(feature = "std"))] 2 use alloc::string::String; 3 #[cfg(feature = "std")] 4 use std::string::String; 5 6 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 7 #[derive(Clone, Debug, PartialEq, Eq)] 8 #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] 9 pub enum RadrootsCoreDiscountScope { 10 Bin, 11 OrderTotal, 12 } 13 14 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 15 #[derive(Clone, Debug, PartialEq, Eq)] 16 #[cfg_attr( 17 feature = "serde", 18 serde(rename_all = "snake_case", tag = "kind", content = "amount") 19 )] 20 pub enum RadrootsCoreDiscountThreshold { 21 BinCount { bin_id: String, min: u32 }, 22 OrderQuantity { min: crate::RadrootsCoreQuantity }, 23 } 24 25 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 26 #[derive(Clone, Debug, PartialEq, Eq)] 27 #[cfg_attr( 28 feature = "serde", 29 serde(rename_all = "snake_case", tag = "kind", content = "amount") 30 )] 31 pub enum RadrootsCoreDiscountValue { 32 MoneyPerBin(crate::RadrootsCoreMoney), 33 Percent(crate::RadrootsCorePercent), 34 } 35 36 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] 37 #[derive(Clone, Debug, PartialEq, Eq)] 38 #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] 39 pub struct RadrootsCoreDiscount { 40 pub scope: RadrootsCoreDiscountScope, 41 pub threshold: RadrootsCoreDiscountThreshold, 42 pub value: RadrootsCoreDiscountValue, 43 } 44 45 impl RadrootsCoreDiscount { 46 pub fn is_non_negative(&self) -> bool { 47 let threshold_ok = match &self.threshold { 48 RadrootsCoreDiscountThreshold::BinCount { .. } => true, 49 RadrootsCoreDiscountThreshold::OrderQuantity { min } => !min.amount.is_sign_negative(), 50 }; 51 let value_ok = match &self.value { 52 RadrootsCoreDiscountValue::MoneyPerBin(m) => !m.amount.is_sign_negative(), 53 RadrootsCoreDiscountValue::Percent(p) => !p.value.is_sign_negative(), 54 }; 55 threshold_ok && value_ok 56 } 57 }