(* Toplevel printers for Json_pointer.t, Jsont.json, and Jsont.Error.t Usage in toplevel: #require "json-pointer.top";; Printers are automatically installed when the library is loaded. *) let nav_printer ppf (p : Json_pointer.nav Json_pointer.t) = Json_pointer.pp_verbose ppf p let append_printer ppf (p : Json_pointer.append Json_pointer.t) = Json_pointer.pp_verbose ppf p let json_printer ppf (json : Jsont.json) = match Jsont_bytesrw.encode_string Jsont.json json with | Ok s -> Format.pp_print_string ppf s | Error e -> Format.fprintf ppf "" e let error_printer ppf (e : Jsont.Error.t) = Format.pp_print_string ppf (Jsont.Error.to_string e) (* Automatic printer installation *) let printers = [ "Json_pointer_top.nav_printer"; "Json_pointer_top.append_printer"; "Json_pointer_top.json_printer"; "Json_pointer_top.error_printer" ] (* Suppress stderr during printer installation to avoid noise in MDX tests *) let null_formatter = Format.make_formatter (fun _ _ _ -> ()) (fun () -> ()) let eval_string_quiet str = try let lexbuf = Lexing.from_string str in let phrase = !Toploop.parse_toplevel_phrase lexbuf in Toploop.execute_phrase false null_formatter phrase with _ -> false let rec do_install_printers = function | [] -> true | printer :: rest -> let cmd = Printf.sprintf "#install_printer %s;;" printer in eval_string_quiet cmd && do_install_printers rest let install () = (* Silently ignore failures - this handles non-toplevel contexts like MDX *) ignore (do_install_printers printers) (* Only auto-install when OCAML_TOPLEVEL_NAME is set, indicating a real toplevel *) let () = if Sys.getenv_opt "OCAML_TOPLEVEL_NAME" <> None then install ()