@@ -233,7 +233,7 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable) as this =
233
233
234
234
and compileBySchema ( ns : NamespaceAbstraction ) tyName ( schemaObj : OpenApiSchema ) isRequired registerNew fromByPathCompiler =
235
235
let compileNewObject () =
236
- if schemaObj.Properties.Count = 0 then
236
+ if schemaObj.Properties.Count = 0 && schemaObj.AllOf.Count = 0 then
237
237
if not <| isNull tyName then
238
238
ns.MarkTypeAsNameAlias tyName
239
239
@@ -245,18 +245,37 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable) as this =
245
245
let ty = ProvidedTypeDefinition( tyName, Some typeof< obj>, isErased = false )
246
246
registerNew( tyName, ty :> Type)
247
247
248
+ // Combine composite schemas
249
+ let schemaObjProperties =
250
+ match schemaObj.AllOf.Count > 0 with
251
+ | true ->
252
+ schemaObj.AllOf
253
+ |> Seq.append [ schemaObj ]
254
+ |> Seq.collect( fun x -> x.Properties)
255
+ | false -> schemaObj.Properties
256
+
257
+ let schemaObjRequired =
258
+ match schemaObj.AllOf.Count > 0 with
259
+ | true ->
260
+ schemaObj.AllOf
261
+ |> Seq.append [ schemaObj ]
262
+ |> Seq.collect( fun x -> x.Required)
263
+ |> System.Collections.Generic.HashSet
264
+ :> System.Collections.Generic.ISet< string>
265
+ | false -> schemaObj.Required
266
+
248
267
// Generate fields and properties
249
268
let members =
250
269
let generateProperty = generateProperty( UniqueNameGenerator())
251
270
252
- List.ofSeq schemaObj.Properties
271
+ List.ofSeq schemaObjProperties
253
272
|> List.map( fun p ->
254
273
let propName , propSchema = p.Key, p.Value
255
274
256
275
if String.IsNullOrEmpty( propName) then
257
276
failwithf $" Property cannot be created with empty name. TypeName:%A {tyName}; SchemaObj:%A {schemaObj}"
258
277
259
- let isRequired = schemaObj.Required .Contains( propName)
278
+ let isRequired = schemaObjRequired .Contains( propName)
260
279
261
280
let pTy =
262
281
compileBySchema ns ( ns.ReserveUniqueName tyName ( nicePascalName propName)) propSchema isRequired ns.RegisterType false
@@ -279,15 +298,15 @@ type DefinitionCompiler(schema: OpenApiDocument, provideNullable) as this =
279
298
// Add full-init constructor
280
299
let ctorParams , fields =
281
300
let required , optional =
282
- List.zip ( List.ofSeq schemaObj.Properties ) members
283
- |> List.partition( fun ( x , _ ) -> schemaObj.Required .Contains( x.Key))
301
+ List.zip ( List.ofSeq schemaObjProperties ) members
302
+ |> List.partition( fun ( x , _ ) -> schemaObjRequired .Contains( x.Key))
284
303
285
304
( required @ optional)
286
305
|> List.map( fun ( x , ( f , p )) ->
287
306
let paramName = niceCamelName p.Name
288
307
289
308
let prParam =
290
- if schemaObj.Required .Contains( x.Key) then
309
+ if schemaObjRequired .Contains( x.Key) then
291
310
ProvidedParameter( paramName, f.FieldType)
292
311
else
293
312
let paramDefaultValue = this.GetDefaultValue f.FieldType
0 commit comments