@@ -69,11 +69,13 @@ defmodule OpenApiSpex.CastParameters do
6969 properties: parameters |> Map . new ( fn p -> { p . name , Parameter . schema ( p ) } end ) ,
7070 required: parameters |> Enum . filter ( & & 1 . required ) |> Enum . map ( & & 1 . name )
7171 }
72+ # |> maybe_combine_oneOfs(parameters, components)
7273 |> maybe_add_additional_properties ( components ) ,
7374 parameters_contexts ( parameters )
7475 }
7576 end
7677
78+
7779 # Extract context information from parameters, useful later when casting
7880 defp parameters_contexts ( parameters ) do
7981 Map . new ( parameters , fn parameter ->
@@ -127,13 +129,53 @@ defmodule OpenApiSpex.CastParameters do
127129 location ,
128130 schema . properties |> Map . keys ( ) |> Enum . map ( & Atom . to_string / 1 )
129131 )
132+ |> maybe_combine_params ( schema , parameters_contexts )
130133 |> pre_parse_parameters ( parameters_contexts , parsers )
131134 |> case do
132135 { :error , _ } = err -> err
133136 params -> Cast . cast ( schema , params , components . schemas , opts )
134137 end
135138 end
136139
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+
137179 defp pre_parse_parameters ( % { } = parameters , % { } = parameters_context , parsers ) do
138180 Enum . reduce_while ( parameters , Map . new ( ) , fn { key , value } , acc ->
139181 case pre_parse_parameter ( value , Map . get ( parameters_context , key , % { } ) , parsers ) do
@@ -208,4 +250,20 @@ defmodule OpenApiSpex.CastParameters do
208250 _ -> schema
209251 end
210252 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
211269end
0 commit comments