///|
pub fn find_operational_rate(
  catalog : Array[OperationalRate],
  weight_g : Int,
) -> OperationalRate {
  for item in catalog {
    if weight_g >= item.minimum_g && weight_g <= item.maximum_g {
      break item
    }
  } nobreak {
    if catalog.is_empty() {
      {
        code: "empty",
        zone: "default",
        minimum_g: 0,
        maximum_g: 0,
        rate: Money::zero(),
        multiplier_bp: 10000,
      }
    } else {
      catalog[catalog.length() - 1]
    }
  }
}

///|
pub fn OperationalRate::contains(
  self : OperationalRate,
  weight_g : Int,
) -> Bool {
  weight_g >= self.minimum_g && weight_g <= self.maximum_g
}

///|
pub fn OperationalRate::is_valid(self : OperationalRate) -> Bool {
  self.code.length() > 0 &&
  self.zone.length() > 0 &&
  self.minimum_g >= 0 &&
  self.maximum_g >= self.minimum_g &&
  self.rate.cents >= 0 &&
  self.multiplier_bp > 0
}

///|
pub fn OperationalRate::span(self : OperationalRate) -> Int {
  self.maximum_g - self.minimum_g
}