From 7bd6a69cea4e57bf79cdf7fcd22619506d3c12c1 Mon Sep 17 00:00:00 2001 From: Marcos Magueta Date: Thu, 30 Jul 2026 17:08:17 -0300 Subject: Serialize runtime objects: Multigroup, Branch & Relation --- lib/concepts/Multigroup.ml | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 lib/concepts/Multigroup.ml (limited to 'lib/concepts/Multigroup.ml') diff --git a/lib/concepts/Multigroup.ml b/lib/concepts/Multigroup.ml new file mode 100644 index 0000000..863cd26 --- /dev/null +++ b/lib/concepts/Multigroup.ml @@ -0,0 +1,51 @@ +type address = Hash.hash + +type t = + { name: string; + relations: address } + +module Field = struct + let name = "name" + let relations = "relations" +end + +module Error = struct + open Condition + + let malformed_multigroup () = + condition "multigroup-malformed" + "A multigroup representation did not conform to what was expected" empty + + let malformed_hash length = + condition "multigroup-malformed-hash" "A multigroup relation root was not a valid hash" + ("length" |=| Value.Integer length) +end + +let make ~name ~relations = {name; relations} + +let name multigroup = multigroup.name +let relations multigroup = multigroup.relations + +module Body = struct + type nonrec t = t + + let tag = 'm' + let malformed = Error.malformed_multigroup + + let equal left right = + left.name = right.name && Hash.hash_equals left.relations right.relations + + let fields multigroup = + [ Field.name, Object.Field.string multigroup.name; + Field.relations, Object.Field.address multigroup.relations ] + + let of_fields data = + let open Utilities.Result in + let* name = Object.Field.require_string Field.name data in + let* relations = + Object.Field.require_address ~malformed:Error.malformed_hash Field.relations data + in + Ok {name; relations} +end + +include (Object.Codec.Make (Body) : Object.S with type t := t) -- cgit v1.2.3