hyf

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

commit 1a0260fa46be246dc33138f5d1d3254ea397ce5b
parent 7eb2000f9451e89e3df9d65e5cb996ea29598fe6
Author: triesap <tyson@radroots.org>
Date:   Mon, 21 Sep 2026 12:59:44 +0000

core: add supply claim types

Diffstat:
Asrc/hyf_core/domain/supply_claim.mojo | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtests/test_domain.mojo | 22++++++++++++++++++++++
2 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/src/hyf_core/domain/supply_claim.mojo b/src/hyf_core/domain/supply_claim.mojo @@ -0,0 +1,58 @@ +from hyf_core.domain.product import ProductRef + + +@fieldwise_init +struct SupplyClaim(Copyable, Movable): + var claim_id: String + var product: ProductRef + var status: String + var quantity_state: String + var quantity_value: Int + var quantity_scale: Int + var unit: String + var qualifier: String + var review_required: Bool + + +def supply_claim( + claim_id: String, + product: ProductRef, + status: String, + quantity_state: String, + quantity_value: Int, + quantity_scale: Int, + unit: String, + qualifier: String, +) raises -> SupplyClaim: + if claim_id.strip() == "": + raise Error("claim id must not be empty") + var allowed = ["offered", "forecast", "unavailable", "correction", "unclear"] + var known = False + for candidate in allowed: + if candidate == status: + known = True + if not known: + raise Error("unknown supply status: " + status) + if quantity_state != "known" and quantity_state != "unknown": + raise Error("quantity state must be 'known' or 'unknown'") + if quantity_scale < 0 or quantity_scale > 9: + raise Error("quantity scale must be between 0 and 9") + return SupplyClaim( + claim_id=String(claim_id), + product=product.copy(), + status=String(status), + quantity_state=String(quantity_state), + quantity_value=quantity_value, + quantity_scale=quantity_scale, + unit=String(unit), + qualifier=String(qualifier), + review_required=True, + ) + + +def claim_confirms_inventory(claim: SupplyClaim) -> Bool: + return False + + +def claim_is_forecast(claim: SupplyClaim) -> Bool: + return claim.status == "forecast" diff --git a/tests/test_domain.mojo b/tests/test_domain.mojo @@ -343,3 +343,25 @@ def test_product_reference_resolution_and_unknown() raises: assert_true(not product_matches(tomato, unknown)) with assert_raises(): _ = resolved_product("x", "") + + +from hyf_core.domain.supply_claim import ( + claim_confirms_inventory, + claim_is_forecast, + supply_claim, +) + + +def test_supply_claims_are_per_product_and_not_inventory() raises: + var tomatoes = resolved_product("Roma tomatoes", "tomato.roma") + var basil = resolved_product("Basil", "basil") + var tomato_claim = supply_claim("c1", tomatoes, "offered", "known", 80, 0, "lb", "approximate") + var basil_claim = supply_claim("c2", basil, "unavailable", "unknown", 0, 0, "", "unknown") + assert_equal(tomato_claim.status, "offered") + assert_equal(basil_claim.status, "unavailable") + assert_true(not claim_confirms_inventory(tomato_claim)) + var forecast = supply_claim("c3", basil, "forecast", "unknown", 0, 0, "", "unknown") + assert_true(claim_is_forecast(forecast)) + assert_true(not claim_is_forecast(tomato_claim)) + with assert_raises(): + _ = supply_claim("c4", tomatoes, "probably", "known", 1, 0, "kg", "exact")