forked from ocaml-community/yojson
-
Notifications
You must be signed in to change notification settings - Fork 1
/
util.ml
86 lines (67 loc) · 2.16 KB
/
util.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
exception Type_error of string * json
let typeof = function
| `Assoc _ -> "object"
| `Bool _ -> "bool"
| `Float _ -> "float"
| `Int _ -> "int"
| `List _ -> "array"
| `Null -> "null"
| `String _ -> "string"
let typerr msg js = raise (Type_error (msg ^ typeof js, js))
exception Undefined of string * json
let ( |> ) x f = f x
let assoc name obj =
try List.assoc name obj
with Not_found -> `Null
let member name = function
| `Assoc obj -> assoc name obj
| js -> typerr ("Can't get member '" ^ name ^ "' of non-object type ") js
let index i = function
| `List l as js ->
let len = List.length l in
let wrapped_index = if i < 0 then len + i else i in
if wrapped_index < 0 || wrapped_index >= len then
raise (Undefined ("Index " ^ string_of_int i ^ " out of bounds", js))
else List.nth l wrapped_index
| js -> typerr ("Can't get index " ^ string_of_int i
^ " of non-array type ") js
let map f = function
| `List l -> `List (List.map f l)
| js -> typerr "Can't map function over non-array type " js
let to_assoc = function
| `Assoc obj -> obj
| js -> typerr "Expected object, got " js
let to_bool = function
| `Bool b -> b
| js -> typerr "Expected bool, got " js
let to_bool_option = function
| `Bool b -> Some b
| `Null -> None
| js -> typerr "Expected bool or null, got " js
let to_float = function
| `Float f -> f
| js -> typerr "Expected float, got " js
let to_float_option = function
| `Float f -> Some f
| `Null -> None
| js -> typerr "Expected float or null, got " js
let to_int = function
| `Int i -> i
| js -> typerr "Expected int, got " js
let to_int_option = function
| `Int i -> Some i
| `Null -> None
| js -> typerr "Expected int or null, got " js
let to_list = function
| `List l -> l
| js -> typerr "Expected array, got " js
let to_string = function
| `String s -> s
| js -> typerr "Expected string, got " js
let to_string_option = function
| `String s -> Some s
| `Null -> None
| js -> typerr "Expected string or null, got " js
let convert_each f = function
| `List l -> List.map f l
| js -> typerr "Can't convert each element of non-array type " js