Skip to content

Commit ebb1404

Browse files
committed
Add ppxCustomOpt
1 parent c216bbd commit ebb1404

12 files changed

+473
-98
lines changed

graphql_schema.json

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

schema.graphql

+1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ type customFieldsResult {
266266
favoriteColor: Color!
267267
futureTime: DateTime
268268
nullableColor: Color
269+
nullableString: String
269270
}
270271

271272
type deprecatedFieldsResult {

src/base/graphql_printer.re

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ let is_internal_directive = d =>
8989
| "ppxDecoder"
9090
| "bsCustom"
9191
| "ppxCustom"
92+
| "ppxCustomOpt"
9293
| "bsAs"
9394
| "ppxAs"
9495
| "argumentDefinitions"

src/base/result_decoder.re

+46-18
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ let get_ppx_as = directives => {
8686
let rec unify_type =
8787
(
8888
~has_decoder,
89+
// ^^ track if it already has an inline ppxConfig defined
8990
error_marker,
9091
as_record,
9192
existing_record,
@@ -140,7 +141,11 @@ let rec unify_type =
140141
Res_float({loc: config.map_loc(span)})
141142
| Some(Scalar({sm_name: "Boolean", _})) =>
142143
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
144149
try({
145150
let decoderModule = Hashtbl.find(Ppx_config.custom_fields(), sm_name);
146151
Res_custom_decoder({
@@ -152,7 +157,6 @@ let rec unify_type =
152157
| Not_found => Res_raw_scalar({loc: config.map_loc(span)})
153158
| other => raise(other)
154159
}
155-
| Some(Scalar(_)) => Res_raw_scalar({loc: config.map_loc(span)})
156160
| Some(Object(_) as ty) =>
157161
unify_selection_set(
158162
error_marker,
@@ -504,8 +508,16 @@ and unify_field = (error_marker, config, field_span, ty) => {
504508
has_directive(~prepend=true, "OmitFutureValue", ast_field.fd_directives)
505509
|| !config.future_added_value;
506510
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+
};
509521

510522
let existing_record = get_ppx_as(ast_field.fd_directives);
511523

@@ -564,15 +576,18 @@ and unify_field = (error_marker, config, field_span, ty) => {
564576
switch (
565577
ast_field.fd_directives |> find_directive(~prepend=true, "Decoder"),
566578
ast_field.fd_directives |> find_directive(~prepend=true, "Custom"),
579+
ast_field.fd_directives |> find_directive(~prepend=true, "CustomOpt"),
567580
) {
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
571585
}
572586
) {
573-
| None =>
587+
| `None =>
574588
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 =>
576591
switch (find_argument("module", d_arguments)) {
577592
| None =>
578593
Fr_named_field({
@@ -589,8 +604,8 @@ and unify_field = (error_marker, config, field_span, ty) => {
589604
arguments,
590605
})
591606
| 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})) =>
594609
Fr_named_field({
595610
name: key,
596611
loc_key,
@@ -607,7 +622,20 @@ and unify_field = (error_marker, config, field_span, ty) => {
607622
}),
608623
arguments,
609624
})
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})) =>
611639
Fr_named_field({
612640
name: key,
613641
loc_key,
@@ -1120,15 +1148,15 @@ let rec unify_document_schema = document => {
11201148
fg_directives |> find_directive(~prepend=true, "Decoder"),
11211149
fg_directives |> find_directive(~prepend=true, "Custom"),
11221150
) {
1151+
| (Some(decoder), _)
11231152
| (_, Some(decoder)) => Some(decoder)
1124-
| (Some(decoder), _) => Some(decoder)
11251153
| (None, None) => None
11261154
}
11271155
) {
11281156
| 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) =>
11321160
Error(
11331161
make_error(
11341162
error_marker,
@@ -1137,7 +1165,7 @@ let rec unify_document_schema = document => {
11371165
"ppxDecoder must be given 'module' argument",
11381166
),
11391167
)
1140-
| Some((_, {item: Iv_string(ident), span})) =>
1168+
| (_, Some((_, {item: Iv_string(ident), span}))) =>
11411169
Ok(
11421170
Some(
11431171
structure =>
@@ -1148,7 +1176,7 @@ let rec unify_document_schema = document => {
11481176
}),
11491177
),
11501178
)
1151-
| Some((_, {span, _})) =>
1179+
| (_, Some((_, {span, _}))) =>
11521180
Error(
11531181
make_error(
11541182
error_marker,

tests_bucklescript/__snapshots__/Compile_Apollo_customTypes_re.7419b986.0.snapshot

+65-25
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)