commit 477eecef030599ee7ff472e872989589a4ef1438
parent cbf065a38519ccbf2f03f1af804c56fb9652967f
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:49:37 +0000
core: interpret farm fulfillment and timing claims
Diffstat:
2 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/src/hyf_application/farm_fulfillment.mojo b/src/hyf_application/farm_fulfillment.mojo
@@ -0,0 +1,53 @@
+from hyf_core.domain.time import DateOnly
+from hyf_core.normalization.dates import resolve_relative_expression
+
+
+@fieldwise_init
+struct FulfillmentClaim(Copyable, Movable):
+ var method: String
+ var window_expression: String
+ var resolved_date: String
+ var ambiguity: String
+ var area_verified: Bool
+
+
+def _is_blank(value: String) -> Bool:
+ return String(value).strip().byte_length() == 0
+
+
+def interpret_fulfillment(
+ method: String,
+ window_expression: String,
+ reference_date: DateOnly,
+ timezone: String,
+) raises -> FulfillmentClaim:
+ if _is_blank(method):
+ raise Error("fulfillment requires a method")
+ if _is_blank(window_expression):
+ return FulfillmentClaim(
+ method=String(method), window_expression="", resolved_date="",
+ ambiguity="none", area_verified=False,
+ )
+ if _is_blank(timezone):
+ return FulfillmentClaim(
+ method=String(method), window_expression=String(window_expression),
+ resolved_date="", ambiguity="missing_zone", area_verified=False,
+ )
+ var resolved = resolve_relative_expression(window_expression, reference_date)
+ if resolved.resolution != "resolved":
+ return FulfillmentClaim(
+ method=String(method), window_expression=String(window_expression),
+ resolved_date="", ambiguity=String(resolved.ambiguity),
+ area_verified=False,
+ )
+ var date = (
+ String(resolved.date.year)
+ + "-"
+ + String(resolved.date.month)
+ + "-"
+ + String(resolved.date.day)
+ )
+ return FulfillmentClaim(
+ method=String(method), window_expression=String(window_expression),
+ resolved_date=date, ambiguity="none", area_verified=False,
+ )
diff --git a/tests/test_application.mojo b/tests/test_application.mojo
@@ -119,3 +119,19 @@ def test_authorized_change_target_resolution() raises:
assert_true(unauthorized.unresolved)
var ambiguous = resolve_change_target("withdrawal", None, authorized)
assert_equal(ambiguous.operation, "unresolved")
+
+
+from hyf_application.farm_fulfillment import interpret_fulfillment
+from hyf_core.domain.time import date_only
+
+
+def test_farm_fulfillment_and_timing_claims() raises:
+ var monday = date_only(2026, 9, 21)
+ var delivery = interpret_fulfillment("delivery", "Friday", monday, "America/Vancouver")
+ assert_equal(delivery.resolved_date, "2026-9-25")
+ assert_equal(delivery.ambiguity, "none")
+ assert_true(not delivery.area_verified)
+ var no_zone = interpret_fulfillment("delivery", "Friday", monday, "")
+ assert_equal(no_zone.ambiguity, "missing_zone")
+ var none = interpret_fulfillment("pickup", "", monday, "America/Vancouver")
+ assert_equal(none.window_expression, "")