package ppx_yojson_conv

  1. Overview
  2. Docs

Source file yojson_conv_error.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
(* Conv_error: Module for Handling Errors during Automated Yojson
   Conversions *)

open! StdLabels
open Yojson_conv

let sprintf = Printf.sprintf

(* Errors concerning tuples *)

let tuple_of_size_n_expected loc n yojson =
  of_yojson_error (sprintf "%s_of_yojson: tuple of size %d expected" loc n) yojson
;;

(* Errors concerning sum types *)

let stag_no_args loc yojson =
  of_yojson_error (loc ^ "_of_yojson: sum tag does not take arguments") yojson
;;

let stag_incorrect_n_args loc tag yojson =
  let msg =
    sprintf "%s_of_yojson: sum tag %S has incorrect number of arguments" loc tag
  in
  of_yojson_error msg yojson
;;

let stag_takes_args loc yojson =
  of_yojson_error (loc ^ "_of_yojson: sum tag must be a structured value") yojson
;;

let nested_list_invalid_sum loc yojson =
  of_yojson_error (loc ^ "_of_yojson: a nested list is an invalid sum") yojson
;;

let empty_list_invalid_sum loc yojson =
  of_yojson_error (loc ^ "_of_yojson: the empty list is an invalid sum") yojson
;;

let unexpected_stag loc yojson =
  of_yojson_error (loc ^ "_of_yojson: unexpected sum tag") yojson
;;

(* Errors concerning records *)

let record_superfluous_fields ~what ~loc rev_fld_names yojson =
  let fld_names_str = String.concat (List.rev rev_fld_names) ~sep:" " in
  let msg = sprintf "%s_of_yojson: %s: %s" loc what fld_names_str in
  of_yojson_error msg yojson
;;

let record_duplicate_fields loc rev_fld_names yojson =
  record_superfluous_fields ~what:"duplicate fields" ~loc rev_fld_names yojson
;;

let record_extra_fields loc rev_fld_names yojson =
  record_superfluous_fields ~what:"extra fields" ~loc rev_fld_names yojson
;;

let rec record_get_undefined_loop fields = function
  | [] -> String.concat (List.rev fields) ~sep:" "
  | (true, field) :: rest -> record_get_undefined_loop (field :: fields) rest
  | _ :: rest -> record_get_undefined_loop fields rest
;;

let record_undefined_elements loc yojson lst =
  let undefined = record_get_undefined_loop [] lst in
  let msg =
    sprintf
      "%s_of_yojson: the following record elements were undefined: %s"
      loc
      undefined
  in
  of_yojson_error msg yojson
;;

let record_list_instead_atom loc yojson =
  let msg = loc ^ "_of_yojson: list instead of atom for record expected" in
  of_yojson_error msg yojson
;;

let record_poly_field_value loc yojson =
  let msg =
    loc
    ^ "_of_yojson: cannot convert values of types resulting from polymorphic record \
       fields"
  in
  of_yojson_error msg yojson
;;

(* Errors concerning polymorphic variants *)

exception No_variant_match

let no_variant_match () = raise No_variant_match

let no_matching_variant_found loc yojson =
  of_yojson_error (loc ^ "_of_yojson: no matching variant found") yojson
;;

let ptag_no_args loc yojson =
  of_yojson_error
    (loc ^ "_of_yojson: polymorphic variant does not take arguments")
    yojson
;;

let ptag_incorrect_n_args loc cnstr yojson =
  let msg =
    sprintf
      "%s_of_yojson: polymorphic variant tag %S has incorrect number of arguments"
      loc
      cnstr
  in
  of_yojson_error msg yojson
;;

let ptag_takes_args loc yojson =
  of_yojson_error (loc ^ "_of_yojson: polymorphic variant tag takes an argument") yojson
;;

let nested_list_invalid_poly_var loc yojson =
  of_yojson_error
    (loc ^ "_of_yojson: a nested list is an invalid polymorphic variant")
    yojson
;;

let empty_list_invalid_poly_var loc yojson =
  of_yojson_error
    (loc ^ "_of_yojson: the empty list is an invalid polymorphic variant")
    yojson
;;

let empty_type loc yojson =
  of_yojson_error (loc ^ "_of_yojson: trying to convert an empty type") yojson
;;
OCaml

Innovation. Community. Security.