···43434444(* Decoder helpers *)
45454646+(* Local helper to reduce Jsont.Error.msgf boilerplate *)
4747+let err_msg meta fmt = Jsont.Error.msgf meta fmt
4848+let err_msg_none fmt = Jsont.Error.msgf Jsont.Meta.none fmt
4949+4650let check_depth d ~nest =
4751 if nest > d.max_depth then
4848- Jsont.Error.msgf Jsont.Meta.none "Maximum nesting depth %d exceeded"
4949- d.max_depth
5252+ err_msg_none "Maximum nesting depth %d exceeded" d.max_depth
50535154let check_nodes d =
5255 d.node_count <- d.node_count + 1;
5356 if d.node_count > d.max_nodes then
5454- Jsont.Error.msgf Jsont.Meta.none "Maximum node count %d exceeded"
5555- d.max_nodes
5757+ err_msg_none "Maximum node count %d exceeded" d.max_nodes
56585759let meta_of_span d span =
5860 if not d.locs then d.meta_none
···115117 | Some ev ->
116118 let span = ev.Event.span in
117119 let meta = meta_of_span d span in
118118- Jsont.Error.msgf meta "Expected %s but found %a" name Event.pp
119119- ev.Event.event
120120- | None ->
121121- Jsont.Error.msgf Jsont.Meta.none "Expected %s but reached end of stream"
122122- name
120120+ err_msg meta "Expected %s but found %a" name Event.pp ev.Event.event
121121+ | None -> err_msg_none "Expected %s but reached end of stream" name
123122124123(* Error helpers *)
125124126125let _err_expected_scalar d ev =
127126 let meta = meta_of_span d ev.Event.span in
128128- Jsont.Error.msgf meta "Expected scalar but found %a" Event.pp ev.Event.event
127127+ err_msg meta "Expected scalar but found %a" Event.pp ev.Event.event
129128130129let err_type_mismatch d span t ~fnd =
130130+ let open Jsont.Repr in
131131 let meta = meta_of_span d span in
132132- Jsont.Error.msgf meta "Expected %s but found %s" (Jsont.Repr.kinded_sort t)
133133- fnd
132132+ err_msg meta "Expected %s but found %s" (kinded_sort t) fnd
134133135134(* YAML scalar resolution *)
136135···215214 fun d ~nest t ->
216215 check_depth d ~nest;
217216 match peek_event d with
218218- | None -> Jsont.Error.msgf Jsont.Meta.none "Unexpected end of YAML stream"
217217+ | None -> err_msg_none "Unexpected end of YAML stream"
219218 | Some ev -> (
220219 match (ev.Event.event, t) with
221220 (* Scalar events *)
···248247 | Event.Mapping_start _, _ -> err_type_mismatch d ev.span t ~fnd:"mapping"
249248 (* Unexpected events *)
250249 | Event.Sequence_end, _ ->
251251- Jsont.Error.msgf (meta_of_span d ev.span) "Unexpected sequence end"
250250+ err_msg (meta_of_span d ev.span) "Unexpected sequence end"
252251 | Event.Mapping_end, _ ->
253253- Jsont.Error.msgf (meta_of_span d ev.span) "Unexpected mapping end"
252252+ err_msg (meta_of_span d ev.span) "Unexpected mapping end"
254253 | Event.Document_start _, _ ->
255255- Jsont.Error.msgf (meta_of_span d ev.span) "Unexpected document start"
254254+ err_msg (meta_of_span d ev.span) "Unexpected document start"
256255 | Event.Document_end _, _ ->
257257- Jsont.Error.msgf (meta_of_span d ev.span) "Unexpected document end"
256256+ err_msg (meta_of_span d ev.span) "Unexpected document end"
258257 | Event.Stream_start _, _ ->
259259- Jsont.Error.msgf (meta_of_span d ev.span) "Unexpected stream start"
258258+ err_msg (meta_of_span d ev.span) "Unexpected stream start"
260259 | Event.Stream_end, _ ->
261261- Jsont.Error.msgf (meta_of_span d ev.span) "Unexpected stream end")
260260+ err_msg (meta_of_span d ev.span) "Unexpected stream end")
262261263262and decode_scalar : type a.
264263 decoder -> nest:int -> Event.spanned -> string -> Scalar_style.t -> a t -> a
···280279 a =
281280 fun d ev value style t map ->
282281 check_nodes d;
282282+ let meta = meta_of_span d ev.span in
283283+ let type_err fnd = Jsont.Repr.type_error meta t ~fnd in
283284 (* Determine which decoder to use based on scalar content *)
284285 if is_null_scalar value then
285286 match map.dec_null with
286287 | Some t' -> decode_scalar_as d ev value style t'
287287- | None ->
288288- Jsont.Repr.type_error (meta_of_span d ev.span) t ~fnd:Jsont.Sort.Null
288288+ | None -> type_err Jsont.Sort.Null
289289 else if style = `Plain then
290290 (* Try bool, then number, then string *)
291291 match bool_of_scalar_opt value with
···295295 | None -> (
296296 match map.dec_string with
297297 | Some t' -> decode_scalar_as d ev value style t'
298298- | None ->
299299- Jsont.Repr.type_error (meta_of_span d ev.span) t
300300- ~fnd:Jsont.Sort.Bool))
298298+ | None -> type_err Jsont.Sort.Bool))
301299 | None -> (
302300 match float_of_scalar_opt value with
303301 | Some _ -> (
···306304 | None -> (
307305 match map.dec_string with
308306 | Some t' -> decode_scalar_as d ev value style t'
309309- | None ->
310310- Jsont.Repr.type_error (meta_of_span d ev.span) t
311311- ~fnd:Jsont.Sort.Number))
307307+ | None -> type_err Jsont.Sort.Number))
312308 | None -> (
313309 (* Plain scalar that's not bool/number -> string *)
314310 match map.dec_string with
315311 | Some t' -> decode_scalar_as d ev value style t'
316316- | None ->
317317- Jsont.Repr.type_error (meta_of_span d ev.span) t
318318- ~fnd:Jsont.Sort.String))
312312+ | None -> type_err Jsont.Sort.String))
319313 else
320314 (* Quoted scalars are strings *)
321315 match map.dec_string with
322316 | Some t' -> decode_scalar_as d ev value style t'
323323- | None ->
324324- Jsont.Repr.type_error (meta_of_span d ev.span) t ~fnd:Jsont.Sort.String
317317+ | None -> type_err Jsont.Sort.String
325318326319and decode_alias : type a. decoder -> Event.spanned -> string -> a t -> a =
327320 fun d ev anchor t ->
···329322 match Hashtbl.find_opt d._anchors anchor with
330323 | None ->
331324 let meta = meta_of_span d ev.span in
332332- Jsont.Error.msgf meta "Unknown anchor: %s" anchor
333333- | Some json -> (
325325+ err_msg meta "Unknown anchor: %s" anchor
326326+ | Some json_value ->
334327 (* Decode the stored JSON value through the type *)
335328 let t' = Jsont.Repr.unsafe_to_t t in
336336- match Jsont.Json.decode' t' json with
329329+ match Jsont.Json.decode' t' json_value with
337330 | Ok v -> v
338338- | Error e -> raise (Jsont.Error e))
331331+ | Error e -> raise (Jsont.Error e)
339332340333and decode_array : type a elt b.
341334 decoder -> nest:int -> Event.spanned -> (a, elt, b) array_map -> a =
342342- fun d ~nest start_ev map ->
335335+ fun d ~nest start_ev array_map ->
343336 skip_event d;
344337 (* consume Sequence_start *)
345338 check_nodes d;
346339 let meta = meta_of_span d start_ev.span in
347347- let builder = ref (map.dec_empty ()) in
340340+ let builder = ref (array_map.dec_empty ()) in
348341 let idx = ref 0 in
349342 let rec loop () =
350343 match peek_event d with
351344 | Some { Event.event = Event.Sequence_end; span } ->
352345 skip_event d;
353346 let end_meta = meta_of_span d span in
354354- map.dec_finish end_meta !idx !builder
347347+ array_map.dec_finish end_meta !idx !builder
355348 | Some _ ->
356349 let i = !idx in
357350 (try
358358- if map.dec_skip i !builder then begin
351351+ if array_map.dec_skip i !builder then begin
359352 (* Skip this element by decoding as ignore *)
360353 let _ : unit =
361354 decode d ~nest:(nest + 1) (Jsont.Repr.of_t Jsont.ignore)
···363356 ()
364357 end
365358 else begin
366366- let elt = decode d ~nest:(nest + 1) map.elt in
367367- builder := map.dec_add i elt !builder
359359+ let elt = decode d ~nest:(nest + 1) array_map.elt in
360360+ builder := array_map.dec_add i elt !builder
368361 end
369362 with Jsont.Error e ->
370370- let imeta = Jsont.Meta.none in
371371- Jsont.Repr.error_push_array meta map (i, imeta) e);
363363+ Jsont.Repr.error_push_array meta array_map (i, Jsont.Meta.none) e);
372364 incr idx;
373365 loop ()
374374- | None -> Jsont.Error.msgf meta "Unclosed sequence"
366366+ | None -> err_msg meta "Unclosed sequence"
375367 in
376368 loop ()
377369···432424 mem_dec String_map.t ->
433425 Dict.t ->
434426 Dict.t =
435435- fun d ~nest obj_meta map umems mem_miss dict ->
427427+ fun d ~nest obj_meta object_map umems mem_miss dict ->
436428 let ubuilder =
437429 ref
438430 (match umems with
···446438 | Some { Event.event = Event.Mapping_end; _ } ->
447439 skip_event d;
448440 (* Finalize *)
449449- finish_object obj_meta map umems !ubuilder !mem_miss !dict
441441+ finish_object obj_meta object_map umems !ubuilder !mem_miss !dict
450442 | Some ev ->
451443 (* Expect a scalar key *)
452444 let name, name_meta = decode_mapping_key d ev in
453445 (* Look up member decoder *)
454454- (match String_map.find_opt name map.mem_decs with
446446+ (match String_map.find_opt name object_map.mem_decs with
455447 | Some (Mem_dec mem) -> (
456448 mem_miss := String_map.remove name !mem_miss;
457449 try
458450 let v = decode d ~nest:(nest + 1) mem.type' in
459451 dict := Dict.add mem.id v !dict
460452 with Jsont.Error e ->
461461- Jsont.Repr.error_push_object obj_meta map (name, name_meta) e)
453453+ Jsont.Repr.error_push_object obj_meta object_map (name, name_meta)
454454+ e)
462455 | None -> (
463456 (* Unknown member *)
464457 match umems with
···468461 in
469462 ()
470463 | Unknown_error ->
471471- Jsont.Repr.unexpected_mems_error obj_meta map
464464+ Jsont.Repr.unexpected_mems_error obj_meta object_map
472465 ~fnd:[ (name, name_meta) ]
473466 | Unknown_keep (mmap, _) -> (
474467 try
475468 let v = decode d ~nest:(nest + 1) mmap.mems_type in
476469 ubuilder := mmap.dec_add name_meta name v !ubuilder
477470 with Jsont.Error e ->
478478- Jsont.Repr.error_push_object obj_meta map (name, name_meta) e)
479479- ));
471471+ Jsont.Repr.error_push_object obj_meta object_map
472472+ (name, name_meta) e)));
480473 loop ()
481481- | None -> Jsont.Error.msgf obj_meta "Unclosed mapping"
474474+ | None -> err_msg obj_meta "Unclosed mapping"
482475 in
483476 loop ()
484477···491484 Dict.t ->
492485 Dict.t =
493486 fun meta map umems ubuilder mem_miss dict ->
487487+ let open Jsont.Repr in
494488 let dict = Dict.add object_meta_arg meta dict in
495489 let dict =
496490 match umems with
···508502 with Exit ->
509503 let no_default _ (Mem_dec mm) = Option.is_none mm.dec_absent in
510504 let exp = String_map.filter no_default mem_miss in
511511- Jsont.Repr.missing_mems_error meta map ~exp ~fnd:[]
505505+ missing_mems_error meta map ~exp ~fnd:[]
512506513507and decode_object_cases : type o cases tag.
514508 decoder ->
···521515 (Jsont.name * Jsont.json) list ->
522516 Dict.t ->
523517 Dict.t =
524524- fun d ~nest obj_meta map umems cases mem_miss delayed dict ->
518518+ fun d ~nest obj_meta object_map umems cases mem_miss delayed dict ->
525519 match peek_event d with
526520 | Some { Event.event = Event.Mapping_end; _ } -> (
527521 skip_event d;
528522 (* No tag found - use dec_absent if available *)
529523 match cases.tag.dec_absent with
530524 | Some tag ->
531531- decode_with_case_tag d ~nest obj_meta map umems cases tag mem_miss
532532- delayed dict
525525+ decode_with_case_tag d ~nest obj_meta object_map umems cases tag
526526+ mem_miss delayed dict
533527 | None ->
534528 (* Missing required case tag *)
535529 let exp = String_map.singleton cases.tag.name (Mem_dec cases.tag) in
536530 let fnd = List.map (fun ((n, _), _) -> n) delayed in
537537- Jsont.Repr.missing_mems_error obj_meta map ~exp ~fnd)
531531+ Jsont.Repr.missing_mems_error obj_meta object_map ~exp ~fnd)
538532 | Some ev ->
539533 let name, name_meta = decode_mapping_key d ev in
540534 if String.equal name cases.tag.name then begin
541535 (* Found the case tag *)
542536 let tag = decode d ~nest:(nest + 1) cases.tag.type' in
543543- decode_with_case_tag d ~nest obj_meta map umems cases tag mem_miss
544544- delayed dict
537537+ decode_with_case_tag d ~nest obj_meta object_map umems cases tag
538538+ mem_miss delayed dict
545539 end
546540 else begin
547541 (* Not the case tag - check if known member or delay *)
548548- match String_map.find_opt name map.mem_decs with
542542+ match String_map.find_opt name object_map.mem_decs with
549543 | Some (Mem_dec mem) -> (
550544 let mem_miss = String_map.remove name mem_miss in
551545 try
552546 let v = decode d ~nest:(nest + 1) mem.type' in
553547 let dict = Dict.add mem.id v dict in
554554- decode_object_cases d ~nest obj_meta map umems cases mem_miss
555555- delayed dict
548548+ decode_object_cases d ~nest obj_meta object_map umems cases
549549+ mem_miss delayed dict
556550 with Jsont.Error e ->
557557- Jsont.Repr.error_push_object obj_meta map (name, name_meta) e)
551551+ Jsont.Repr.error_push_object obj_meta object_map (name, name_meta)
552552+ e)
558553 | None ->
559554 (* Unknown member - decode as generic JSON and delay *)
560560- let v = decode d ~nest:(nest + 1) (Jsont.Repr.of_t Jsont.json) in
555555+ let v =
556556+ decode d ~nest:(nest + 1) (Jsont.Repr.of_t Jsont.json)
557557+ in
561558 let delayed = ((name, name_meta), v) :: delayed in
562562- decode_object_cases d ~nest obj_meta map umems cases mem_miss
563563- delayed dict
559559+ decode_object_cases d ~nest obj_meta object_map umems cases
560560+ mem_miss delayed dict
564561 end
565565- | None -> Jsont.Error.msgf obj_meta "Unclosed mapping"
562562+ | None -> err_msg obj_meta "Unclosed mapping"
566563567564and decode_with_case_tag : type o cases tag.
568565 decoder ->
···577574 Dict.t ->
578575 Dict.t =
579576 fun d ~nest obj_meta map umems cases tag mem_miss delayed dict ->
577577+ let open Jsont.Repr in
580578 let eq_tag (Case c) = cases.tag_compare c.tag tag = 0 in
581579 match List.find_opt eq_tag cases.cases with
582582- | None -> Jsont.Repr.unexpected_case_tag_error obj_meta map cases tag
580580+ | None -> unexpected_case_tag_error obj_meta map cases tag
583581 | Some (Case case) ->
584582 (* Continue decoding with the case's object map *)
585583 let case_dict =
···605603 let mem_miss = String_map.union u mem_miss case_map.mem_decs in
606604 let dict, mem_miss =
607605 List.fold_left
608608- (fun (dict, mem_miss) ((name, meta), json) ->
606606+ (fun (dict, mem_miss) ((name, meta), json_value) ->
609607 match String_map.find_opt name case_map.mem_decs with
610608 | Some (Mem_dec mem) -> (
611609 let t' = Jsont.Repr.unsafe_to_t mem.type' in
612612- match Jsont.Json.decode' t' json with
610610+ match Jsont.Json.decode' t' json_value with
613611 | Ok v ->
614612 let dict = Dict.add mem.id v dict in
615613 let mem_miss = String_map.remove name mem_miss in
···646644 (value, meta)
647645 | _ ->
648646 let meta = meta_of_span d ev.span in
649649- Jsont.Error.msgf meta "Mapping keys must be scalars (strings), found %a"
650650- Event.pp ev.event
647647+ err_msg meta "Mapping keys must be scalars (strings), found %a" Event.pp
648648+ ev.event
651649652650(* Skip stream/document wrappers *)
653651let skip_to_content d =
···675673 | None -> ()
676674 | Some ev ->
677675 let meta = meta_of_span d ev.span in
678678- Jsont.Error.msgf meta "Expected end of document but found %a" Event.pp
679679- ev.event
676676+ err_msg meta "Expected end of document but found %a" Event.pp ev.event
680677 in
681678 loop ()
682679···730727 | Error.Yamlrw_error err ->
731728 skip_to_document_end d;
732729 let msg = Error.to_string err in
733733- let e =
734734- Jsont.Error.make_msg Jsont.Error.Context.empty Jsont.Meta.none msg
735735- in
730730+ let e = Jsont.(Error.make_msg Error.Context.empty Meta.none msg) in
736731 Seq.Cons (Error e, next_doc))
737732 in
738733 next_doc
···754749 | Jsont.Error e -> Error e
755750 | Error.Yamlrw_error err ->
756751 let msg = Error.to_string err in
757757- Error (Jsont.Error.make_msg Jsont.Error.Context.empty Jsont.Meta.none msg)
752752+ Error Jsont.(Error.make_msg Error.Context.empty Meta.none msg)
758753759754let decode ?layout ?locs ?file ?max_depth ?max_nodes t reader =
760755 Result.map_error Jsont.Error.to_string
···785780 else if String.contains s '\n' then `Literal
786781 else if String.length s > 80 then `Folded
787782 else `Plain
783783+784784+(* Helper to create scalar events with common defaults *)
785785+let scalar_event ?(anchor = None) ?(tag = None) ~value ~style () =
786786+ Event.Scalar
787787+ {
788788+ anchor;
789789+ tag;
790790+ value;
791791+ plain_implicit = true;
792792+ quoted_implicit = true;
793793+ style;
794794+ }
795795+796796+(* Helper to emit events *)
797797+let emit e = Emitter.emit e.emitter
788798789799(* Encode null *)
790790-let encode_null e _meta =
791791- Emitter.emit e.emitter
792792- (Event.Scalar
793793- {
794794- anchor = None;
795795- tag = None;
796796- value = "null";
797797- plain_implicit = true;
798798- quoted_implicit = true;
799799- style = `Plain;
800800- })
800800+let encode_null e _meta = emit e (scalar_event ~value:"null" ~style:`Plain ())
801801802802(* Encode boolean *)
803803let encode_bool e _meta b =
804804- Emitter.emit e.emitter
805805- (Event.Scalar
806806- {
807807- anchor = None;
808808- tag = None;
809809- value = (if b then "true" else "false");
810810- plain_implicit = true;
811811- quoted_implicit = true;
812812- style = `Plain;
813813- })
804804+ emit e (scalar_event ~value:(if b then "true" else "false") ~style:`Plain ())
814805815806(* Encode number *)
816807let encode_number e _meta f =
···822813 if Float.is_integer f && Float.abs f < 1e15 then Printf.sprintf "%.0f" f
823814 else Printf.sprintf "%g" f
824815 in
825825- Emitter.emit e.emitter
826826- (Event.Scalar
827827- {
828828- anchor = None;
829829- tag = None;
830830- value;
831831- plain_implicit = true;
832832- quoted_implicit = true;
833833- style = `Plain;
834834- })
816816+ emit e (scalar_event ~value ~style:`Plain ())
835817836818(* Encode string *)
837819let encode_string e _meta s =
838820 let style = choose_scalar_style ~preferred:e.scalar_style s in
839839- Emitter.emit e.emitter
840840- (Event.Scalar
841841- {
842842- anchor = None;
843843- tag = None;
844844- value = s;
845845- plain_implicit = true;
846846- quoted_implicit = true;
847847- style;
848848- })
821821+ emit e (scalar_event ~value:s ~style ())
849822850823let rec encode : type a. encoder -> a t -> a -> unit =
851824 fun e t v ->
···877850and encode_array : type a elt b. encoder -> (a, elt, b) array_map -> a -> unit =
878851 fun e map v ->
879852 let style = layout_style_of_format e.format in
880880- Emitter.emit e.emitter
853853+ emit e
881854 (Event.Sequence_start { anchor = None; tag = None; implicit = true; style });
882855 let _ =
883856 map.enc
···886859 ())
887860 () v
888861 in
889889- Emitter.emit e.emitter Event.Sequence_end
862862+ emit e Event.Sequence_end
890863891864and encode_object : type o. encoder -> (o, o) object_map -> o -> unit =
892865 fun e map v ->
893866 let style = layout_style_of_format e.format in
894894- Emitter.emit e.emitter
895895- (Event.Mapping_start { anchor = None; tag = None; implicit = true; style });
867867+ emit e (Event.Mapping_start { anchor = None; tag = None; implicit = true; style });
896868 (* Encode each member *)
897869 List.iter
898870 (fun (Mem_enc mem) ->
899871 let mem_v = mem.enc v in
900872 if not (mem.enc_omit mem_v) then begin
901873 (* Emit key *)
902902- Emitter.emit e.emitter
903903- (Event.Scalar
904904- {
905905- anchor = None;
906906- tag = None;
907907- value = mem.name;
908908- plain_implicit = true;
909909- quoted_implicit = true;
910910- style = `Plain;
911911- });
874874+ emit e (scalar_event ~value:mem.name ~style:`Plain ());
912875 (* Emit value *)
913876 encode e mem.type' mem_v
914877 end)
···920883 let (Case_value (case_map, case_v)) = cases.enc_case (cases.enc v) in
921884 (* Emit case tag *)
922885 if not (cases.tag.enc_omit case_map.tag) then begin
923923- Emitter.emit e.emitter
924924- (Event.Scalar
925925- {
926926- anchor = None;
927927- tag = None;
928928- value = cases.tag.name;
929929- plain_implicit = true;
930930- quoted_implicit = true;
931931- style = `Plain;
932932- });
886886+ emit e (scalar_event ~value:cases.tag.name ~style:`Plain ());
933887 encode e cases.tag.type' case_map.tag
934888 end;
935889 (* Emit case members *)
···937891 (fun (Mem_enc mem) ->
938892 let mem_v = mem.enc case_v in
939893 if not (mem.enc_omit mem_v) then begin
940940- Emitter.emit e.emitter
941941- (Event.Scalar
942942- {
943943- anchor = None;
944944- tag = None;
945945- value = mem.name;
946946- plain_implicit = true;
947947- quoted_implicit = true;
948948- style = `Plain;
949949- });
894894+ emit e (scalar_event ~value:mem.name ~style:`Plain ());
950895 encode e mem.type' mem_v
951896 end)
952897 case_map.object_map.mem_encs);
953953- Emitter.emit e.emitter Event.Mapping_end
898898+ emit e Event.Mapping_end
954899955900(* Public encode API *)
956901···965910 let emitter = Emitter.of_writer ~config writer in
966911 let e = make_encoder ?format ?indent ?explicit_doc ?scalar_style emitter in
967912 try
968968- Emitter.emit e.emitter (Event.Stream_start { encoding = `Utf8 });
969969- Emitter.emit e.emitter
970970- (Event.Document_start { version = None; implicit = not e.explicit_doc });
913913+ emit e (Event.Stream_start { encoding = `Utf8 });
914914+ emit e (Event.Document_start { version = None; implicit = not e.explicit_doc });
971915 let t' = Jsont.Repr.of_t t in
972916 encode e t' v;
973973- Emitter.emit e.emitter
974974- (Event.Document_end { implicit = not e.explicit_doc });
975975- Emitter.emit e.emitter Event.Stream_end;
917917+ emit e (Event.Document_end { implicit = not e.explicit_doc });
918918+ emit e Event.Stream_end;
976919 if eod then Emitter.flush e.emitter;
977920 Ok ()
978921 with
979922 | Jsont.Error err -> Error err
980923 | Error.Yamlrw_error err ->
981924 let msg = Error.to_string err in
982982- Error (Jsont.Error.make_msg Jsont.Error.Context.empty Jsont.Meta.none msg)
925925+ Error Jsont.(Error.make_msg Error.Context.empty Meta.none msg)
983926984927let encode ?buf ?format ?indent ?explicit_doc ?scalar_style t v ~eod writer =
985928 Result.map_error Jsont.Error.to_string