hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

pack.mojo (1905B)


      1 from hyf_core.domain.quantity import Quantity
      2 from hyf_core.domain.units import unit_dimension
      3 
      4 
      5 @fieldwise_init
      6 struct PackRule(Copyable, Movable):
      7     var product_id: String
      8     var pack_unit: String
      9     var inner_unit: String
     10     var per_pack_value: Int
     11     var per_pack_scale: Int
     12     var version: String
     13 
     14 
     15 def pack_rule(
     16     product_id: String,
     17     pack_unit: String,
     18     inner_unit: String,
     19     per_pack_value: Int,
     20     per_pack_scale: Int,
     21     version: String,
     22 ) raises -> PackRule:
     23     if product_id.strip() == "" or version.strip() == "":
     24         raise Error("pack rule requires product_id and version")
     25     if pack_unit.strip() == "" or inner_unit.strip() == "":
     26         raise Error("pack rule requires pack_unit and inner_unit")
     27     if per_pack_value <= 0:
     28         raise Error("pack rule per_pack_value must be positive")
     29     if per_pack_scale < 0 or per_pack_scale > 9:
     30         raise Error("pack rule per_pack_scale must be between 0 and 9")
     31     if unit_dimension(inner_unit) == "unknown":
     32         raise Error("pack rule inner_unit dimension is unknown")
     33     return PackRule(
     34         product_id=String(product_id),
     35         pack_unit=String(pack_unit),
     36         inner_unit=String(inner_unit),
     37         per_pack_value=per_pack_value,
     38         per_pack_scale=per_pack_scale,
     39         version=String(version),
     40     )
     41 
     42 
     43 def apply_pack_conversion(
     44     product_id: String, packs: Quantity, rule: PackRule
     45 ) raises -> Quantity:
     46     if product_id != rule.product_id:
     47         raise Error("pack rule does not apply to product " + product_id)
     48     if packs.unit != rule.pack_unit:
     49         raise Error("pack rule does not apply to unit " + packs.unit)
     50     var result = packs.copy()
     51     result.value = packs.value * rule.per_pack_value
     52     result.scale = packs.scale + rule.per_pack_scale
     53     result.unit = String(rule.inner_unit)
     54     result.dimension = String(unit_dimension(rule.inner_unit))
     55     return result^