lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README | LICENSE

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 }