flitter/external/jsonwheel/json_in.ml
Joey Yakimowich-Payne fa600b98f7 Add poc files
2018-05-26 10:55:38 +09:00

51 lines
1.2 KiB
OCaml

type t = Json_type.t
open Json_type
let filter_result x =
Browse.assert_object_or_array x;
x
let check_channel_is_utf8 ic =
let start = pos_in ic in
let encoding =
try
let c1 = input_char ic in
let c2 = input_char ic in
let c3 = input_char ic in
let c4 = input_char ic in
Json_lexer.detect_encoding c1 c2 c3 c4
with End_of_file -> `UTF8 in
if encoding <> `UTF8 then
json_error "Only UTF-8 encoding is supported";
(try seek_in ic start
with _ -> json_error "Not a regular file")
(* from_channel and from_channel4 work
only on seekable devices (regular files) *)
let from_channel p recursive file ic =
check_channel_is_utf8 ic;
let lexbuf = Lexing.from_channel ic in
Json_lexer.set_file_name lexbuf file;
let j =
Json_parser.main
(Json_lexer.token p)
lexbuf
in
if recursive then j
else filter_result j
let load_json
?allow_comments ?allow_nan ?big_int_mode ?(recursive = false)
file =
let ic = open_in file in
let x =
let p =
Json_lexer.make_param ?allow_comments ?allow_nan ?big_int_mode () in
try `Result (from_channel p recursive file ic)
with e -> `Exn e in
close_in ic;
match x with
`Result x -> x
| `Exn e -> raise e