commit dfc2a7accded8cb1e59242a9f3d03ef5815fb3e6
parent a5d09c4d0ef9568c8b1145dc6030d77f44850cbb
Author: triesap <tyson@radroots.org>
Date: Mon, 21 Sep 2026 12:53:24 +0000
core: add source identity and revision types
Diffstat:
4 files changed, 126 insertions(+), 0 deletions(-)
diff --git a/pixi.toml b/pixi.toml
@@ -24,6 +24,7 @@ test-runtime = "mojo -I src tests/test_runtime_paths.mojo"
test-repo-local-process = "mojo -I src tests/test_repo_local_process_contract.mojo"
test-stdio = "mojo -I src tests/test_stdio_contract.mojo"
test-provider-adapter = "mojo -I src -I tests tests/test_provider_adapter.mojo"
+test-domain = "mojo -I src -I tests tests/test_domain.mojo"
test-spec = "mojo -I src -I tests tests/test_traceability.mojo"
check-build = "mkdir -p .pixi/build && mojo build -I src src/main.mojo -o .pixi/build/hyfd"
check-format = "sh tools/check_format.sh"
diff --git a/src/hyf_core/domain/__init__.mojo b/src/hyf_core/domain/__init__.mojo
@@ -0,0 +1 @@
+# domain package
diff --git a/src/hyf_core/domain/source.mojo b/src/hyf_core/domain/source.mojo
@@ -0,0 +1,86 @@
+from std.collections import List, Optional
+
+
+@fieldwise_init
+struct SourceId(Copyable, Movable):
+ var value: String
+
+
+@fieldwise_init
+struct ActorId(Copyable, Movable):
+ var value: String
+
+
+@fieldwise_init
+struct FarmId(Copyable, Movable):
+ var value: String
+
+
+@fieldwise_init
+struct NeedId(Copyable, Movable):
+ var value: String
+
+
+@fieldwise_init
+struct LotId(Copyable, Movable):
+ var value: String
+
+
+@fieldwise_init
+struct Revision(Copyable, Movable):
+ var value: String
+
+
+def _require_identity(value: String, context: String) raises -> String:
+ var trimmed = String(String(value).strip())
+ if trimmed == "":
+ raise Error(context + " must not be empty")
+ if trimmed != value:
+ raise Error(context + " must not include boundary whitespace")
+ return trimmed^
+
+
+def source_id(value: String) raises -> SourceId:
+ return SourceId(value=_require_identity(value, "source id"))
+
+
+def actor_id(value: String) raises -> ActorId:
+ return ActorId(value=_require_identity(value, "actor id"))
+
+
+def farm_id(value: String) raises -> FarmId:
+ return FarmId(value=_require_identity(value, "farm id"))
+
+
+def need_id(value: String) raises -> NeedId:
+ return NeedId(value=_require_identity(value, "need id"))
+
+
+def lot_id(value: String) raises -> LotId:
+ return LotId(value=_require_identity(value, "lot id"))
+
+
+def revision(value: String) raises -> Revision:
+ return Revision(value=_require_identity(value, "revision"))
+
+
+@fieldwise_init
+struct TrustedSource(Copyable, Movable):
+ var source_id: SourceId
+ var revision: Revision
+ var actor_id: ActorId
+ var farm_id: FarmId
+
+
+def trusted_source(
+ source_id_value: String,
+ revision_value: String,
+ actor_id_value: String,
+ farm_id_value: String,
+) raises -> TrustedSource:
+ return TrustedSource(
+ source_id=source_id(source_id_value),
+ revision=revision(revision_value),
+ actor_id=actor_id(actor_id_value),
+ farm_id=farm_id(farm_id_value),
+ )
diff --git a/tests/test_domain.mojo b/tests/test_domain.mojo
@@ -0,0 +1,38 @@
+from std.testing import TestSuite, assert_equal, assert_raises, assert_true
+
+from hyf_core.domain.source import (
+ actor_id,
+ farm_id,
+ lot_id,
+ need_id,
+ revision,
+ source_id,
+ trusted_source,
+)
+
+
+def test_source_identity_accepts_valid_and_rejects_empty() raises:
+ assert_equal(source_id("s1").value, "s1")
+ assert_equal(actor_id("a1").value, "a1")
+ assert_equal(farm_id("f1").value, "f1")
+ assert_equal(need_id("n1").value, "n1")
+ assert_equal(lot_id("l1").value, "l1")
+ assert_equal(revision("r1").value, "r1")
+ with assert_raises():
+ _ = source_id("")
+ with assert_raises():
+ _ = revision(" r1")
+ with assert_raises():
+ _ = actor_id("a1 ")
+
+
+def test_trusted_source_preserves_revision() raises:
+ var source = trusted_source("s1", "r1", "a1", "f1")
+ assert_equal(source.source_id.value, "s1")
+ assert_equal(source.revision.value, "r1")
+ assert_equal(source.actor_id.value, "a1")
+ assert_equal(source.farm_id.value, "f1")
+
+
+def main() raises:
+ TestSuite.discover_tests[__functions_in_module()]().run()