@@ -69,11 +69,13 @@ defmodule OpenApiSpex.CastParameters do
69
69
properties: parameters |> Map . new ( fn p -> { p . name , Parameter . schema ( p ) } end ) ,
70
70
required: parameters |> Enum . filter ( & & 1 . required ) |> Enum . map ( & & 1 . name )
71
71
}
72
+ # |> maybe_combine_oneOfs(parameters, components)
72
73
|> maybe_add_additional_properties ( components ) ,
73
74
parameters_contexts ( parameters )
74
75
}
75
76
end
76
77
78
+
77
79
# Extract context information from parameters, useful later when casting
78
80
defp parameters_contexts ( parameters ) do
79
81
Map . new ( parameters , fn parameter ->
@@ -127,13 +129,53 @@ defmodule OpenApiSpex.CastParameters do
127
129
location ,
128
130
schema . properties |> Map . keys ( ) |> Enum . map ( & Atom . to_string / 1 )
129
131
)
132
+ |> maybe_combine_params ( schema , parameters_contexts )
130
133
|> pre_parse_parameters ( parameters_contexts , parsers )
131
134
|> case do
132
135
{ :error , _ } = err -> err
133
136
params -> Cast . cast ( schema , params , components . schemas , opts )
134
137
end
135
138
end
136
139
140
+ # in caase some parameters have explode: true we want to search for those
141
+ # fields in parameters and combine the parameters in a single struct
142
+ # so that the casting can do further work
143
+ defp maybe_combine_params ( % { } = parameters , % { } = schema , % { } = parameters_contexts ) do
144
+ Enum . reduce ( parameters_contexts , parameters , fn
145
+ { key , % { explode: true } } , parameters ->
146
+ # we have exploding property, we need to search for it's possible fields
147
+ # and add them under the key into the parameters struct.
148
+ # do we leave the fields in the params as well? not sure.
149
+ schema_of_exploding_property = Map . get ( schema . properties , String . to_existing_atom ( key ) , % { } )
150
+
151
+ fields =
152
+ Schema . properties ( schema_of_exploding_property ) ++
153
+ Schema . possible_properties ( schema_of_exploding_property )
154
+
155
+ { struct_params , found_keys } =
156
+ Enum . reduce ( fields , { Map . new ( ) , [ ] } , fn { field_key , _ } , { struct_params , found_keys } ->
157
+ param_field_key = field_key |> Atom . to_string ( )
158
+ val = Map . get ( parameters , param_field_key )
159
+
160
+ { new_params , new_found_keys } =
161
+ unless is_nil ( val ) do
162
+ { Map . put ( struct_params , param_field_key , val ) , [ param_field_key | found_keys ] }
163
+ else
164
+ { struct_params , found_keys }
165
+ end
166
+
167
+ { new_params , new_found_keys }
168
+ end )
169
+
170
+ parameters
171
+ |> Map . drop ( found_keys )
172
+ |> Map . put ( key , struct_params )
173
+
174
+ _ , parameters ->
175
+ parameters
176
+ end )
177
+ end
178
+
137
179
defp pre_parse_parameters ( % { } = parameters , % { } = parameters_context , parsers ) do
138
180
Enum . reduce_while ( parameters , Map . new ( ) , fn { key , value } , acc ->
139
181
case pre_parse_parameter ( value , Map . get ( parameters_context , key , % { } ) , parsers ) do
@@ -208,4 +250,20 @@ defmodule OpenApiSpex.CastParameters do
208
250
_ -> schema
209
251
end
210
252
end
253
+
254
+ defp maybe_combine_oneOfs ( schema , parameters , components ) do
255
+ # check if any params have explode,
256
+ # if so add the properties of it's schema to the top level
257
+ # and remove the key for that
258
+ % { }
259
+ end
260
+
261
+ defp create_one_of_schemas ( parameters ) do
262
+ if Enum . any? ( parameters , fn p ->
263
+ p . explode == true and is_list ( Parameter . schema ( p ) . oneOf )
264
+ end ) do
265
+ # in this case we need to create multiple schemas. Each of the schemas
266
+ # has to have properties defined in other parameters + add required properties
267
+ end
268
+ end
211
269
end
0 commit comments