@@ -17,7 +17,7 @@ let makeArrayOfJsonFieldsFromParsedFieldDeclarations parsedFields =
17
17
[% expr [% e key], [% e BatOption. get encoder] [% e field]])
18
18
|> Exp. array
19
19
20
- let wrapInSpreadDecoder parsedFields baseExpr =
20
+ let wrapInSpreadEncoder parsedFields baseExpr =
21
21
let spreadExpr =
22
22
match List. find_opt (fun {name} -> name = " ..." ) parsedFields with
23
23
| Some {codecs = Some otherEncoder , _ } ->
@@ -29,7 +29,9 @@ let wrapInSpreadDecoder parsedFields baseExpr =
29
29
Make sure to use the text 'valueToEncode' here. It should match the value defined in
30
30
generateEncoder below. There's a comment there about why we don't pass this name in
31
31
as a parameter. *)
32
- let otherEncoderLident = [% expr [% e otherEncoder] valueToEncode] in
32
+ let otherEncoderLident =
33
+ [% expr [% e otherEncoder] (Obj. magic valueToEncode)]
34
+ in
33
35
Some [% expr Decco. unsafeMergeJsonObjectsCurried [% e otherEncoderLident]]
34
36
| _ -> None
35
37
in
@@ -72,7 +74,7 @@ let generateEncoder parsedFields unboxed (rootTypeNameOfRecord : label) =
72
74
[% e
73
75
makeArrayOfJsonFieldsFromParsedFieldDeclarations
74
76
parsedFieldsWithoutSpread])]
75
- |> wrapInSpreadDecoder parsedFields
77
+ |> wrapInSpreadEncoder parsedFields
76
78
(* This is where the final encoder function is constructed. If
77
79
you need to do something with the parameters, this is the place. *)
78
80
|> Exp. fun_ Asttypes. Nolabel None constrainedFunctionArgsPattern
@@ -100,9 +102,10 @@ let generateErrorCase {key} =
100
102
pc_rhs = [% expr Belt.Result. Error {e with path = " ." ^ [% e key] ^ e.path}];
101
103
}
102
104
103
- let generateFinalRecordExpr decls =
104
- decls |> List. map (fun {name} -> (lid name, makeIdentExpr name)) |> fun l ->
105
- [% expr Belt.Result. Ok [% e Exp. record l None ]]
105
+ let generateFinalRecordExpr allFieldDeclarations =
106
+ allFieldDeclarations
107
+ |> List. map (fun {name} -> (lid name, makeIdentExpr name))
108
+ |> fun l -> [% expr Belt.Result. Ok [% e Exp. record l None ]]
106
109
107
110
let generateSuccessCase {name} successExpr =
108
111
{
@@ -128,9 +131,12 @@ let rec generateNestedSwitchesRecurse allDecls remainingDecls =
128
131
let generateNestedSwitches decls = generateNestedSwitchesRecurse decls decls
129
132
130
133
let generateDecoder decls unboxed =
134
+ let fieldDeclarationsWithoutSpread =
135
+ List. filter (fun {name} -> name <> " ..." ) decls
136
+ in
131
137
match unboxed with
132
138
| true ->
133
- let {codecs; name} = List. hd decls in
139
+ let {codecs; name} = List. hd fieldDeclarationsWithoutSpread in
134
140
let _, d = codecs in
135
141
let recordExpr =
136
142
[(lid name, makeIdentExpr " v" )] |> fun __x -> Exp. record __x None
@@ -142,8 +148,8 @@ let generateDecoder decls unboxed =
142
148
[% expr
143
149
fun v ->
144
150
match Js.Json. classify v with
145
- | (( Js.Json. JSONObject dict ) [@ explicit_arity ]) ->
146
- [% e generateNestedSwitches decls ]
151
+ | Js.Json. JSONObject dict ->
152
+ [% e generateNestedSwitches fieldDeclarationsWithoutSpread ]
147
153
| _ -> Decco. error " Not an object" v]
148
154
149
155
let parseRecordField encodeDecodeFlags (rootTypeNameOfRecord : label )
@@ -163,7 +169,7 @@ let parseRecordField encodeDecodeFlags (rootTypeNameOfRecord : label)
163
169
{
164
170
name = txt;
165
171
key;
166
- field = Exp. field [% expr v ] (lid txt);
172
+ field = Exp. field [% expr valueToEncode ] (lid txt);
167
173
codecs = Codecs. generateCodecs encodeDecodeFlags pld_type;
168
174
default;
169
175
}
0 commit comments