mirror of
https://github.com/ocaml-tracing/ocaml-opentelemetry.git
synced 2026-03-09 12:23:32 -04:00
113 lines
3.4 KiB
OCaml
113 lines
3.4 KiB
OCaml
[@@@ocaml.warning "-23-27-30-39-44"]
|
|
|
|
type status = {
|
|
mutable _presence: Pbrt.Bitfield.t;
|
|
(** tracking presence for 2 fields *)
|
|
mutable code : int32;
|
|
mutable message : bytes;
|
|
mutable details : bytes list;
|
|
}
|
|
|
|
let default_status (): status =
|
|
{
|
|
_presence=Pbrt.Bitfield.empty;
|
|
code=0l;
|
|
message=Bytes.create 0;
|
|
details=[];
|
|
}
|
|
|
|
|
|
(** {2 Make functions} *)
|
|
|
|
let[@inline] has_status_code (self:status) : bool = (Pbrt.Bitfield.get self._presence 0)
|
|
let[@inline] has_status_message (self:status) : bool = (Pbrt.Bitfield.get self._presence 1)
|
|
|
|
let[@inline] set_status_code (self:status) (x:int32) : unit =
|
|
self._presence <- (Pbrt.Bitfield.set self._presence 0); self.code <- x
|
|
let[@inline] set_status_message (self:status) (x:bytes) : unit =
|
|
self._presence <- (Pbrt.Bitfield.set self._presence 1); self.message <- x
|
|
let[@inline] set_status_details (self:status) (x:bytes list) : unit =
|
|
self.details <- x
|
|
|
|
let copy_status (self:status) : status =
|
|
{ self with code = self.code }
|
|
|
|
let make_status
|
|
?(code:int32 option)
|
|
?(message:bytes option)
|
|
~(details:bytes list)
|
|
() : status =
|
|
let _res = default_status () in
|
|
(match code with
|
|
| None -> ()
|
|
| Some v -> set_status_code _res v);
|
|
(match message with
|
|
| None -> ()
|
|
| Some v -> set_status_message _res v);
|
|
set_status_details _res details;
|
|
_res
|
|
|
|
[@@@ocaml.warning "-23-27-30-39"]
|
|
|
|
(** {2 Formatters} *)
|
|
|
|
let rec pp_status fmt (v:status) =
|
|
let pp_i fmt () =
|
|
Pbrt.Pp.pp_record_field ~first:true "code" Pbrt.Pp.pp_int32 fmt v.code;
|
|
if not (Pbrt.Bitfield.get v._presence 0) then Format.pp_print_string fmt "(* absent *)";
|
|
Pbrt.Pp.pp_record_field ~first:false "message" Pbrt.Pp.pp_bytes fmt v.message;
|
|
if not (Pbrt.Bitfield.get v._presence 1) then Format.pp_print_string fmt "(* absent *)";
|
|
Pbrt.Pp.pp_record_field ~first:false "details" (Pbrt.Pp.pp_list Pbrt.Pp.pp_bytes) fmt v.details;
|
|
in
|
|
Pbrt.Pp.pp_brk pp_i fmt ()
|
|
|
|
[@@@ocaml.warning "-23-27-30-39"]
|
|
|
|
(** {2 Protobuf Encoding} *)
|
|
|
|
let rec encode_pb_status (v:status) encoder =
|
|
if (Pbrt.Bitfield.get v._presence 0) then (
|
|
Pbrt.Encoder.int32_as_varint v.code encoder;
|
|
Pbrt.Encoder.key 1 Pbrt.Varint encoder;
|
|
);
|
|
if (Pbrt.Bitfield.get v._presence 1) then (
|
|
Pbrt.Encoder.bytes v.message encoder;
|
|
Pbrt.Encoder.key 2 Pbrt.Bytes encoder;
|
|
);
|
|
Pbrt.List_util.rev_iter_with (fun x encoder ->
|
|
Pbrt.Encoder.bytes x encoder;
|
|
Pbrt.Encoder.key 3 Pbrt.Bytes encoder;
|
|
) v.details encoder;
|
|
()
|
|
|
|
[@@@ocaml.warning "-23-27-30-39"]
|
|
|
|
(** {2 Protobuf Decoding} *)
|
|
|
|
let rec decode_pb_status d =
|
|
let v = default_status () in
|
|
let continue__= ref true in
|
|
while !continue__ do
|
|
match Pbrt.Decoder.key d with
|
|
| None -> (
|
|
(* put lists in the correct order *)
|
|
set_status_details v (List.rev v.details);
|
|
); continue__ := false
|
|
| Some (1, Pbrt.Varint) -> begin
|
|
set_status_code v (Pbrt.Decoder.int32_as_varint d);
|
|
end
|
|
| Some (1, pk) ->
|
|
Pbrt.Decoder.unexpected_payload "Message(status), field(1)" pk
|
|
| Some (2, Pbrt.Bytes) -> begin
|
|
set_status_message v (Pbrt.Decoder.bytes d);
|
|
end
|
|
| Some (2, pk) ->
|
|
Pbrt.Decoder.unexpected_payload "Message(status), field(2)" pk
|
|
| Some (3, Pbrt.Bytes) -> begin
|
|
set_status_details v ((Pbrt.Decoder.bytes d) :: v.details);
|
|
end
|
|
| Some (3, pk) ->
|
|
Pbrt.Decoder.unexpected_payload "Message(status), field(3)" pk
|
|
| Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind
|
|
done;
|
|
(v : status)
|