commit 9c7fa5606ba4d9abd230eee2efeb4b057ad13372
parent ec1d857aae82dba1d3964e8736d488202bbf3d1f
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:48:55 +0000
core: associate quantities with farm products
Diffstat:
2 files changed, 57 insertions(+), 0 deletions(-)
diff --git a/src/hyf_application/farm_quantity.mojo b/src/hyf_application/farm_quantity.mojo
@@ -0,0 +1,37 @@
+
+
+@fieldwise_init
+struct ProductQuantityAssociation(Copyable, Movable):
+ var product_phrase: String
+ var quantity_value: Int
+ var quantity_scale: Int
+ var unit: String
+ var qualifier: String
+ var unreserved_verified: Bool
+
+
+def associate_quantity(
+ product_phrase: String,
+ quantity_value: Int,
+ quantity_scale: Int,
+ unit: String,
+ qualifier: String,
+) raises -> ProductQuantityAssociation:
+ if String(product_phrase).strip().byte_length() == 0:
+ raise Error("association requires a product phrase")
+ if quantity_scale < 0 or quantity_scale > 9:
+ raise Error("association scale must be between 0 and 9")
+ if qualifier != "exact" and qualifier != "approximate":
+ raise Error("association qualifier must be exact or approximate")
+ return ProductQuantityAssociation(
+ product_phrase=String(product_phrase),
+ quantity_value=quantity_value,
+ quantity_scale=quantity_scale,
+ unit=String(unit),
+ qualifier=String(qualifier),
+ unreserved_verified=False,
+ )
+
+
+def reported_quantity_is_unreserved_stock() -> Bool:
+ return False
diff --git a/tests/test_application.mojo b/tests/test_application.mojo
@@ -62,3 +62,23 @@ def test_product_specific_supply_status_per_crop() raises:
assert_true(status_is_forecast(forecast[0].status))
var unknown = interpret_product_statuses(products, "probably")
assert_equal(unknown[0].status, "unclear")
+
+
+from hyf_application.farm_quantity import (
+ ProductQuantityAssociation,
+ associate_quantity,
+ reported_quantity_is_unreserved_stock,
+)
+
+
+def test_quantity_association_per_product_without_swap() raises:
+ var tomatoes = associate_quantity("roma tomatoes", 80, 0, "lb", "approximate")
+ var basil = associate_quantity("basil", 0, 0, "bunch", "exact")
+ assert_equal(tomatoes.product_phrase, "roma tomatoes")
+ assert_equal(tomatoes.quantity_value, 80)
+ assert_equal(tomatoes.qualifier, "approximate")
+ assert_equal(basil.product_phrase, "basil")
+ assert_true(tomatoes.quantity_value != basil.quantity_value)
+ assert_true(not reported_quantity_is_unreserved_stock())
+ with assert_raises():
+ _ = associate_quantity("", 1, 0, "kg", "exact")