open Wire type t = { block_offset : int; block_count : int; dp_class : int; priority : int; name_len : int; name : string; crc32 : int; } let codec = let open Codec in record "DpPayload" (fun block_offset block_count dp_class priority name_len name crc32 -> { block_offset; block_count; dp_class; priority; name_len; name; crc32 }) |+ field "block_offset" uint32be (fun t -> t.block_offset) |+ field "block_count" uint32be (fun t -> t.block_count) |+ field "dp_class" uint16be (fun t -> t.dp_class) |+ field "priority" uint8 (fun t -> t.priority) |+ field "name_len" uint8 (fun t -> t.name_len) |+ field "name" (byte_array ~size:(int 64)) (fun t -> t.name) |+ field "crc32" uint32be (fun t -> t.crc32) |> seal let v ~block_offset ~block_count ~dp_class ~priority ~name ~crc32 = let name_len = min 64 (String.length name) in { block_offset; block_count; dp_class; priority; name_len; name; crc32 } let name_string t = String.sub t.name 0 (min t.name_len (String.length t.name)) let pp ppf t = Fmt.pf ppf "@[dp(off=%d count=%d class=%d pri=%d name=%S crc=0x%08x)@]" t.block_offset t.block_count t.dp_class t.priority (name_string t) t.crc32 let equal a b = a.block_offset = b.block_offset && a.block_count = b.block_count && a.dp_class = b.dp_class && a.priority = b.priority && a.name_len = b.name_len && String.equal a.name b.name && a.crc32 = b.crc32