2
2
3
3
open Decoders_util
4
4
5
- type 'value exposed_error =
6
- | Decoder_error of string * 'value option
7
- | Decoder_errors of 'value exposed_error list
8
- | Decoder_tag of string * 'value exposed_error
9
-
10
5
type ('good, 'bad) result = ('good , 'bad ) My_result .t =
11
6
| Ok of 'good
12
7
| Error of 'bad
13
8
14
- type ('value, 'a) exposed_decoder = ('value , 'a , 'value exposed_error ) Decoder .t
15
-
16
9
(* * Signature of things that can be decoded. *)
17
10
module type Decodeable = sig
18
11
type value
44
37
module type S = sig
45
38
type value
46
39
47
- type error = value exposed_error
40
+ type error = value Error .t
48
41
49
42
val pp_error : Format .formatter -> error -> unit
50
43
@@ -165,41 +158,18 @@ end
165
158
module Make (Decodeable : Decodeable ) :
166
159
S
167
160
with type value = Decodeable. value
168
- and type 'a decoder = (Decodeable. value, 'a) exposed_decoder = struct
161
+ and type 'a decoder =
162
+ (Decodeable. value, 'a, Decodeable. value Error. t) Decoder. t = struct
169
163
type value = Decodeable .value
170
164
171
165
let pp = Decodeable. pp
172
166
173
- type error = value exposed_error
174
-
175
- let rec pp_error fmt = function
176
- | Decoder_error (msg , Some t ) ->
177
- Format. fprintf fmt " @[%s, but got@ @[%a@]@]" msg pp t
178
- | Decoder_error (msg , None) ->
179
- Format. fprintf fmt " @[%s@]" msg
180
- | Decoder_errors errors ->
181
- let errors_trunc = My_list. take 5 errors in
182
- let not_shown = List. length errors - 5 in
183
- Format. fprintf
184
- fmt
185
- " @[%a@ %s@]"
186
- (Format. pp_print_list ~pp_sep: Format. pp_print_space pp_error)
187
- errors_trunc
188
- ( if not_shown > 0
189
- then Printf. sprintf " (...%d errors not shown...)" not_shown
190
- else " " )
191
- | Decoder_tag (msg , error ) ->
192
- Format. fprintf fmt " @[<2>%s:@ @[%a@]@]" msg pp_error error
167
+ type error = value Error .t
193
168
169
+ let pp_error = Error. pp ~pp_i: pp
194
170
195
171
let string_of_error e : string = Format. asprintf " @[<2>%a@?@]" pp_error e
196
172
197
- let tag_error (msg : string ) (error : error ) : error = Decoder_tag (msg, error)
198
-
199
- let tag_errors (msg : string ) (errors : error list ) : error =
200
- Decoder_tag (msg, Decoder_errors errors)
201
-
202
-
203
173
let combine_errors (results : ('a, error) result list ) :
204
174
('a list , error list ) result =
205
175
let rec aux combined = function
@@ -230,31 +200,25 @@ module Make (Decodeable : Decodeable) :
230
200
fun string ->
231
201
Decodeable. of_string string
232
202
|> My_result. map_err (fun msg ->
233
- Decoder_tag ( " Json parse error" , Decoder_error (msg, None )) )
203
+ Error. tag " Json parse error" ( Error. make msg) )
234
204
235
205
236
206
let of_file : string -> (value, error) result =
237
207
fun file ->
238
208
Decodeable. of_file file
239
209
|> My_result. map_err (fun msg ->
240
- Decoder_tag
241
- (Printf. sprintf " While reading %s" file, Decoder_error (msg, None )))
210
+ Error. tag (Printf. sprintf " While reading %s" file) (Error. make msg) )
242
211
243
212
244
- type 'a decoder = (value , 'a ) exposed_decoder
213
+ type 'a decoder = (value , 'a , value Error .t ) Decoder .t
245
214
246
215
let succeed x = Decoder. pure x
247
216
248
- let fail msg input = Error (Decoder_error ( msg, Some input) )
217
+ let fail msg input = Error (Error. make msg ~context: input)
249
218
250
219
let fail_with error = Decoder. fail error
251
220
252
- let from_result = function
253
- | Ok ok ->
254
- succeed ok
255
- | Error error ->
256
- fail_with error
257
-
221
+ let from_result = Decoder. of_result
258
222
259
223
let value = Decoder. value
260
224
@@ -296,7 +260,7 @@ module Make (Decodeable : Decodeable) :
296
260
| None ->
297
261
decoder input
298
262
|> My_result. map My_opt. return
299
- |> My_result. map_err (tag_error " Expected null or" )
263
+ |> My_result. map_err (Error. tag " Expected null or" )
300
264
301
265
302
266
let one_of (decoders : (string * 'a decoder) list ) : 'a decoder =
@@ -305,12 +269,12 @@ module Make (Decodeable : Decodeable) :
305
269
|> My_list. map (fun (name , d ) ->
306
270
d
307
271
|> Decoder. map_err (fun e ->
308
- tag_errors (Printf. sprintf " %S decoder" name) [ e ] ) )
272
+ Error. tag_group (Printf. sprintf " %S decoder" name) [ e ] ) )
309
273
in
310
274
Decoder. one_of
311
275
decoders
312
276
~combine_errors:
313
- (tag_errors " I tried the following decoders but they all failed" )
277
+ (Error. tag_group " I tried the following decoders but they all failed" )
314
278
315
279
316
280
let primitive_decoder (get_value : value -> 'a option ) (message : string ) :
@@ -346,9 +310,9 @@ module Make (Decodeable : Decodeable) :
346
310
values
347
311
|> My_list. mapi (fun i x ->
348
312
decoder x
349
- |> My_result. map_err (tag_error (Printf. sprintf " element %i" i)) )
313
+ |> My_result. map_err (Error. tag (Printf. sprintf " element %i" i)) )
350
314
|> combine_errors
351
- |> My_result. map_err (tag_errors " while decoding a list" )
315
+ |> My_result. map_err (Error. tag_group " while decoding a list" )
352
316
353
317
354
318
let list_filter : 'a option decoder -> 'a list decoder =
@@ -359,7 +323,7 @@ module Make (Decodeable : Decodeable) :
359
323
| v :: vs ->
360
324
My_result.Infix. (
361
325
decoder v
362
- |> My_result. map_err (tag_error (Printf. sprintf " element %i" i))
326
+ |> My_result. map_err (Error. tag (Printf. sprintf " element %i" i))
363
327
>> = (function
364
328
| Some x ->
365
329
go (i + 1 ) vs >> = fun xs -> My_result. return (x :: xs)
@@ -371,7 +335,7 @@ module Make (Decodeable : Decodeable) :
371
335
| None ->
372
336
(fail " Expected a list" ) t
373
337
| Some values ->
374
- go 0 values |> My_result. map_err (tag_error " while decoding a list" )
338
+ go 0 values |> My_result. map_err (Error. tag " while decoding a list" )
375
339
376
340
377
341
let list_fold_left : ('a -> 'a decoder) -> 'a -> 'a decoder =
@@ -388,11 +352,11 @@ module Make (Decodeable : Decodeable) :
388
352
>> = fun acc ->
389
353
(acc |> decoder_func) el
390
354
|> My_result. map_err
391
- (tag_error (Printf. sprintf " element %i" i)) )
355
+ (Error. tag (Printf. sprintf " element %i" i)) )
392
356
, i + 1 ) )
393
357
(Ok init, 0 ))
394
358
|> fst
395
- |> My_result. map_err (tag_error " while decoding a list" )
359
+ |> My_result. map_err (Error. tag " while decoding a list" )
396
360
397
361
398
362
let array : 'a decoder -> 'a array decoder =
@@ -401,8 +365,8 @@ module Make (Decodeable : Decodeable) :
401
365
match res with
402
366
| Ok x ->
403
367
Ok (Array. of_list x)
404
- | Error (Decoder_tag ("while decoding a list" , e )) ->
405
- Error (Decoder_tag (" while decoding an array" , e))
368
+ | Error (Tag ("while decoding a list" , e )) ->
369
+ Error (Tag (" while decoding an array" , e))
406
370
| Error e ->
407
371
Error e
408
372
@@ -422,7 +386,7 @@ module Make (Decodeable : Decodeable) :
422
386
match value with
423
387
| Some value ->
424
388
value_decoder value
425
- |> My_result. map_err (tag_error (Printf. sprintf " in field %S" key))
389
+ |> My_result. map_err (Error. tag (Printf. sprintf " in field %S" key))
426
390
| None ->
427
391
(fail (Printf. sprintf " Expected an object with an attribute %S" key)) t
428
392
@@ -443,7 +407,7 @@ module Make (Decodeable : Decodeable) :
443
407
| Some value ->
444
408
value_decoder value
445
409
|> My_result. map (fun v -> Some v)
446
- |> My_result. map_err (tag_error (Printf. sprintf " in field %S" key))
410
+ |> My_result. map_err (Error. tag (Printf. sprintf " in field %S" key))
447
411
| None ->
448
412
Ok None
449
413
@@ -455,7 +419,7 @@ module Make (Decodeable : Decodeable) :
455
419
( match Decodeable. get_string key with
456
420
| Some key ->
457
421
(value_decoder key) value
458
- |> My_result. map_err (tag_error (Printf. sprintf " in field %S" key))
422
+ |> My_result. map_err (Error. tag (Printf. sprintf " in field %S" key))
459
423
| None ->
460
424
(fail " Expected an object with a string key" ) t )
461
425
| _ ->
@@ -490,10 +454,10 @@ module Make (Decodeable : Decodeable) :
490
454
| Some (x :: rest ) ->
491
455
My_result.Infix. (
492
456
head x
493
- |> My_result. map_err (tag_error " while consuming a list element" )
457
+ |> My_result. map_err (Error. tag " while consuming a list element" )
494
458
>> = fun x ->
495
459
(tail x) (Decodeable. to_list rest)
496
- |> My_result. map_err (tag_error " after consuming a list element" ))
460
+ |> My_result. map_err (Error. tag " after consuming a list element" ))
497
461
| Some [] ->
498
462
(fail " Expected a non-empty list" ) value
499
463
| None ->
@@ -519,7 +483,7 @@ module Make (Decodeable : Decodeable) :
519
483
|> List. map (fun (key , _ ) -> key_decoder key)
520
484
|> combine_errors
521
485
|> My_result. map_err
522
- (tag_errors " Failed while decoding the keys of an object" )
486
+ (Error. tag_group " Failed while decoding the keys of an object" )
523
487
| None ->
524
488
(fail " Expected an object" ) value
525
489
@@ -539,7 +503,7 @@ module Make (Decodeable : Decodeable) :
539
503
value_decoder value_val > |= fun value -> (key, value))
540
504
|> combine_errors
541
505
|> My_result. map_err
542
- (tag_errors " Failed while decoding key-value pairs" )
506
+ (Error. tag_group " Failed while decoding key-value pairs" )
543
507
| None ->
544
508
(fail " Expected an object" ) value
545
509
@@ -559,7 +523,7 @@ module Make (Decodeable : Decodeable) :
559
523
>> = fun key -> (value_decoder key) value_val)
560
524
|> combine_errors
561
525
|> My_result. map_err
562
- (tag_errors " Failed while decoding key-value pairs" )
526
+ (Error. tag_group " Failed while decoding key-value pairs" )
563
527
| None ->
564
528
(fail " Expected an object" ) value
565
529
0 commit comments