@@ -86,6 +86,7 @@ let get_ppx_as = directives => {
86
86
let rec unify_type =
87
87
(
88
88
~has_decoder,
89
+ // ^^ track if it already has an inline ppxConfig defined
89
90
error_marker,
90
91
as_record,
91
92
existing_record,
@@ -140,7 +141,11 @@ let rec unify_type =
140
141
Res_float ({loc: config. map_loc(span)})
141
142
| Some (Scalar ({sm_name: "Boolean" , _ })) =>
142
143
Res_boolean ({loc: config. map_loc(span)})
143
- | Some (Scalar ({sm_name})) when ! has_decoder =>
144
+ | Some (Scalar (_ )) when has_decoder =>
145
+ Res_raw_scalar ({loc: config. map_loc(span)})
146
+ | Some (Scalar ({sm_name})) =>
147
+ // if there is no inline @ppxCustom defined, try look for custom fields
148
+ // in config
144
149
try ({
145
150
let decoderModule = Hashtbl . find(Ppx_config . custom_fields() , sm_name);
146
151
Res_custom_decoder ({
@@ -152,7 +157,6 @@ let rec unify_type =
152
157
| Not_found => Res_raw_scalar ({loc: config. map_loc(span)})
153
158
| other => raise (other)
154
159
}
155
- | Some (Scalar (_ )) => Res_raw_scalar ({loc: config. map_loc(span)})
156
160
| Some (Object (_ ) as ty ) =>
157
161
unify_selection_set(
158
162
error_marker,
@@ -504,8 +508,16 @@ and unify_field = (error_marker, config, field_span, ty) => {
504
508
has_directive(~prepend= true , "OmitFutureValue" , ast_field. fd_directives)
505
509
|| ! config. future_added_value;
506
510
let has_decoder =
507
- has_directive(~prepend= true , "Decoder" , ast_field. fd_directives)
508
- || has_directive(~prepend= true , "Custom" , ast_field. fd_directives);
511
+ switch (
512
+ has_directive(~prepend= true , "Decoder" , ast_field. fd_directives),
513
+ has_directive(~prepend= true , "Custom" , ast_field. fd_directives),
514
+ has_directive(~prepend= true , "CustomOpt" , ast_field. fd_directives),
515
+ ) {
516
+ | (true , _ , _ )
517
+ | (_ , true , _ )
518
+ | (_ , _ , true ) => true
519
+ | (false , false , false ) => false
520
+ };
509
521
510
522
let existing_record = get_ppx_as(ast_field. fd_directives);
511
523
@@ -564,15 +576,18 @@ and unify_field = (error_marker, config, field_span, ty) => {
564
576
switch (
565
577
ast_field. fd_directives |> find_directive(~prepend= true , "Decoder" ),
566
578
ast_field. fd_directives |> find_directive(~prepend= true , "Custom" ),
579
+ ast_field. fd_directives |> find_directive(~prepend= true , "CustomOpt" ),
567
580
) {
568
- | (_ , Some (decoder )) => Some (decoder)
569
- | (Some (decoder ), _ ) => Some (decoder)
570
- | (None , None ) => None
581
+ | (Some (decoder ), _ , _ ) => ` Custom (decoder)
582
+ | (_ , Some (decoder ), _ ) => ` Custom (decoder)
583
+ | (_ , _ , Some (decoder )) => ` CustomOpt (decoder)
584
+ | (None , None , None ) => ` None
571
585
}
572
586
) {
573
- | None =>
587
+ | ` None =>
574
588
Fr_named_field ({name: key, loc_key, loc, type_: parser_expr, arguments})
575
- | Some ({item: {d_arguments, _ }, span}) =>
589
+ | ` Custom ({item: {d_arguments, _ }, span}) as result
590
+ | ` CustomOpt ({item: {d_arguments, _ }, span}) as result =>
576
591
switch (find_argument("module" , d_arguments)) {
577
592
| None =>
578
593
Fr_named_field ({
@@ -589,8 +604,8 @@ and unify_field = (error_marker, config, field_span, ty) => {
589
604
arguments,
590
605
})
591
606
| Some ((_ , {item: Iv_string (module_name ), span})) =>
592
- switch (parser_expr) {
593
- | Res_nullable ({loc, inner: t }) =>
607
+ switch (result , parser_expr) {
608
+ | ( ` Custom ( _ ) , Res_nullable ({loc, inner: t }) ) =>
594
609
Fr_named_field ({
595
610
name: key,
596
611
loc_key,
@@ -607,7 +622,20 @@ and unify_field = (error_marker, config, field_span, ty) => {
607
622
}),
608
623
arguments,
609
624
})
610
- | Res_array ({loc, inner: t }) =>
625
+ | (` CustomOpt (_ ), Res_nullable ({loc, inner: t })) =>
626
+ Fr_named_field ({
627
+ name: key,
628
+ loc_key,
629
+ loc,
630
+ type_:
631
+ Res_custom_decoder ({
632
+ loc: config. map_loc(span),
633
+ ident: module_name,
634
+ inner: Res_nullable ({loc, inner: t}),
635
+ }),
636
+ arguments,
637
+ })
638
+ | (_ , Res_array ({loc, inner: t })) =>
611
639
Fr_named_field ({
612
640
name: key,
613
641
loc_key,
@@ -1120,15 +1148,15 @@ let rec unify_document_schema = document => {
1120
1148
fg_directives |> find_directive(~prepend= true , "Decoder" ),
1121
1149
fg_directives |> find_directive(~prepend= true , "Custom" ),
1122
1150
) {
1151
+ | (Some (decoder ), _ )
1123
1152
| (_ , Some (decoder )) => Some (decoder)
1124
- | (Some (decoder ), _ ) => Some (decoder)
1125
1153
| (None , None ) => None
1126
1154
}
1127
1155
) {
1128
1156
| None => Ok (None )
1129
- | Some ({item: {d_arguments, _ }, span}) =>
1130
- switch (find_argument("module" , d_arguments)) {
1131
- | None =>
1157
+ | Some ({item: {d_arguments, _ }, span}) as result =>
1158
+ switch (result , find_argument("module" , d_arguments)) {
1159
+ | ( _ , None ) =>
1132
1160
Error (
1133
1161
make_error(
1134
1162
error_marker,
@@ -1137,7 +1165,7 @@ let rec unify_document_schema = document => {
1137
1165
"ppxDecoder must be given 'module' argument" ,
1138
1166
),
1139
1167
)
1140
- | Some ((_ , {item: Iv_string (ident ), span})) =>
1168
+ | ( _ , Some ((_ , {item: Iv_string (ident ), span}) )) =>
1141
1169
Ok (
1142
1170
Some (
1143
1171
structure =>
@@ -1148,7 +1176,7 @@ let rec unify_document_schema = document => {
1148
1176
}),
1149
1177
),
1150
1178
)
1151
- | Some ((_ , {span, _ })) =>
1179
+ | ( _ , Some ((_ , {span, _ }) )) =>
1152
1180
Error (
1153
1181
make_error(
1154
1182
error_marker,
0 commit comments