commit ee57d4c46248eeb60674b780a0fbe6e5bbc30ef7
parent 2d95fe9d9a4c4a932d66611d6b331e28217591b7
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 13:00:13 +0000
core: add clarification and review models
Diffstat:
2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/src/hyf_core/domain/review.mojo b/src/hyf_core/domain/review.mojo
@@ -0,0 +1,35 @@
+from std.collections import List
+
+
+@fieldwise_init
+struct Clarification(Copyable, Movable):
+ var field: String
+ var reason: String
+
+
+@fieldwise_init
+struct ReviewState(Copyable, Movable):
+ var required: Bool
+ var clarifications: List[Clarification]
+
+
+def review_clear() -> ReviewState:
+ return ReviewState(required=False, clarifications=List[Clarification]())
+
+
+def review_required(field: String, reason: String) raises -> ReviewState:
+ if field.strip() == "" or reason.strip() == "":
+ raise Error("clarification requires field and reason")
+ var clarifications = List[Clarification]()
+ clarifications.append(Clarification(field=String(field), reason=String(reason)))
+ return ReviewState(required=True, clarifications=clarifications^)
+
+
+def review_add(state: ReviewState, field: String, reason: String) raises -> ReviewState:
+ if field.strip() == "" or reason.strip() == "":
+ raise Error("clarification requires field and reason")
+ var clarifications = List[Clarification]()
+ for existing in state.clarifications:
+ clarifications.append(existing.copy())
+ clarifications.append(Clarification(field=String(field), reason=String(reason)))
+ return ReviewState(required=True, clarifications=clarifications^)
diff --git a/tests/test_domain.mojo b/tests/test_domain.mojo
@@ -389,3 +389,16 @@ def test_supply_change_operations_and_scoped_withdrawal() raises:
assert_equal(correction.operation, "unresolved")
with assert_raises():
_ = proposed_change("galaxy", Optional[String]("x"), "addition", None)
+
+
+from hyf_core.domain.review import review_add, review_clear, review_required
+
+
+def test_review_state_optional_price_does_not_block_withdrawal_does() raises:
+ var clear = review_clear()
+ assert_true(not clear.required)
+ var blocked = review_required("withdrawal.target", "ambiguous_target")
+ assert_true(blocked.required)
+ assert_equal(len(blocked.clarifications), 1)
+ var extended = review_add(blocked, "quantity.unreserved", "stock_unknown")
+ assert_equal(len(extended.clarifications), 2)