Skip to content

Commit f76a451

Browse files
authored
fix decoding of discriminators when type:: object is present (#471)
1 parent 795bf58 commit f76a451

File tree

3 files changed

+47
-17
lines changed

3 files changed

+47
-17
lines changed

lib/open_api_spex/open_api/decode.ex

+16-16
Original file line numberDiff line numberDiff line change
@@ -224,22 +224,6 @@ defmodule OpenApiSpex.OpenApi.Decode do
224224
|> add_extensions(map)
225225
end
226226

227-
defp to_struct(%{"type" => "object"} = map, Schema) do
228-
map
229-
|> Map.update("properties", %{}, fn v ->
230-
v
231-
|> Map.new(fn {k, v} ->
232-
{String.to_atom(k), v}
233-
end)
234-
end)
235-
|> prepare_schema()
236-
|> (&struct_from_map(Schema, &1)).()
237-
|> prop_to_struct(:properties, Schemas)
238-
|> manage_additional_properties()
239-
|> prop_to_struct(:externalDocs, ExternalDocumentation)
240-
|> add_extensions(map)
241-
end
242-
243227
defp to_struct(%{"anyOf" => _valid_schemas} = map, Schema) do
244228
Schema
245229
|> struct_from_map(map)
@@ -264,6 +248,22 @@ defmodule OpenApiSpex.OpenApi.Decode do
264248
|> add_extensions(map)
265249
end
266250

251+
defp to_struct(%{"type" => "object"} = map, Schema) do
252+
map
253+
|> Map.update("properties", %{}, fn v ->
254+
v
255+
|> Map.new(fn {k, v} ->
256+
{String.to_atom(k), v}
257+
end)
258+
end)
259+
|> prepare_schema()
260+
|> (&struct_from_map(Schema, &1)).()
261+
|> prop_to_struct(:properties, Schemas)
262+
|> manage_additional_properties()
263+
|> prop_to_struct(:externalDocs, ExternalDocumentation)
264+
|> add_extensions(map)
265+
end
266+
267267
defp to_struct(%{"not" => _valid_schemas} = map, Schema) do
268268
Schema
269269
|> struct_from_map(map)

test/open_api/decode_test.exs

+17-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ defmodule OpenApiSpex.OpenApi.DecodeTest do
173173

174174
assert %{
175175
"User" => user_schema,
176-
"Admin" => admin_schema
176+
"Admin" => admin_schema,
177+
"DiscriminatorWithType" => disc_with_type
177178
} = schemas
178179

179180
assert %OpenApiSpex.Schema{
@@ -191,6 +192,21 @@ defmodule OpenApiSpex.OpenApi.DecodeTest do
191192
}
192193
} == admin_schema
193194

195+
assert %OpenApiSpex.Schema{
196+
oneOf: [
197+
%OpenApiSpex.Reference{
198+
"$ref": "#/components/schemas/User"
199+
},
200+
%OpenApiSpex.Reference{
201+
"$ref": "#/components/schemas/SpecialUser"
202+
}
203+
],
204+
discriminator: %OpenApiSpex.Discriminator{
205+
propertyName: "userType"
206+
},
207+
type: "object"
208+
} == disc_with_type
209+
194210
assert %OpenApiSpex.Schema{
195211
nullable: false,
196212
readOnly: false,

test/support/encoded_schema.json

+14
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,20 @@
230230
}
231231
}
232232
},
233+
"DiscriminatorWithType": {
234+
"type": "object",
235+
"discriminator": {
236+
"propertyName": "userType"
237+
},
238+
"oneOf": [
239+
{
240+
"$ref": "#/components/schemas/User"
241+
},
242+
{
243+
"$ref": "#/components/schemas/SpecialUser"
244+
}
245+
]
246+
},
233247
"MetadataObject": {
234248
"description": "Maximum 3 lines of metadata allowed",
235249
"type": "object",

0 commit comments

Comments
 (0)