diff --git a/src/main/kotlin/com/cjbooms/fabrikt/model/OasType.kt b/src/main/kotlin/com/cjbooms/fabrikt/model/OasType.kt index f29738e7..b1990362 100644 --- a/src/main/kotlin/com/cjbooms/fabrikt/model/OasType.kt +++ b/src/main/kotlin/com/cjbooms/fabrikt/model/OasType.kt @@ -5,10 +5,10 @@ import com.cjbooms.fabrikt.util.KaizenParserExtensions.isMapTypeAdditionalProper import com.cjbooms.fabrikt.util.KaizenParserExtensions.isSchemaLess import com.cjbooms.fabrikt.util.KaizenParserExtensions.isSimpleMapDefinition import com.cjbooms.fabrikt.util.KaizenParserExtensions.isSimpleOneOfAnyDefinition +import com.cjbooms.fabrikt.util.KaizenParserExtensions.isStringDefinitionWithFormat import com.cjbooms.fabrikt.util.KaizenParserExtensions.isTypedAdditionalProperties import com.cjbooms.fabrikt.util.KaizenParserExtensions.isUnknownAdditionalProperties import com.cjbooms.fabrikt.util.KaizenParserExtensions.isUntypedAdditionalProperties -import com.cjbooms.fabrikt.util.KaizenParserExtensions.isStringDefinitionWithFormat import com.cjbooms.fabrikt.util.KaizenParserExtensions.safeType import com.reprezen.kaizen.oasparser.model3.Schema import kotlin.reflect.KClass @@ -20,7 +20,7 @@ sealed class OasType( val specialization: Specialization = Specialization.NONE ) { object Any : OasType(null) - object OneOfAny : OasType("object", specialization = Specialization.ONE_OF_ANY) + object OneOfAny : OasType(WILD_CARD_TYPE, specialization = Specialization.ONE_OF_ANY) object Boolean : OasType("boolean") object Date : OasType("string", "date") object DateTime : OasType("string", "date-time") @@ -51,9 +51,13 @@ sealed class OasType( OasType("object", specialization = Specialization.TYPED_MAP_ADDITIONAL_PROPERTIES) companion object { + private const val WILD_CARD_TYPE: String = "wildcard" fun Schema.toOasType(oasKey: String): OasType = values(OasType::class) - .filter { it.type == safeType() } + .filter { + it.type == safeType() || + it.type == WILD_CARD_TYPE && getSpecialization(oasKey) == Specialization.ONE_OF_ANY + } .filter { it.specialization == getSpecialization(oasKey) } .filter { it.format == format || it.format == null } .let { candidates -> diff --git a/src/test/resources/examples/anyOfOneOfAllOf/api.yaml b/src/test/resources/examples/anyOfOneOfAllOf/api.yaml index bb7594ea..c7ac182d 100644 --- a/src/test/resources/examples/anyOfOneOfAllOf/api.yaml +++ b/src/test/resources/examples/anyOfOneOfAllOf/api.yaml @@ -3,9 +3,11 @@ components: schemas: SimpleOneOfs: type: object - properties: + properties: oneof_property: $ref: '#/components/schemas/ContainsNestedOneOf' + primitive_oneof_property: + $ref: '#/components/schemas/ContainsPrimitiveOneOf' ComplexParent: allOf: @@ -20,6 +22,13 @@ components: oneOf: - $ref: "#/components/schemas/FirstOneA" - $ref: "#/components/schemas/ComplexSecondOneA" + - type: string + - type: integer + + ContainsPrimitiveOneOf: + oneOf: + - type: string + - type: integer ContainsNestedAnyOf: anyOf: @@ -66,13 +75,13 @@ components: second_property: type: string third_property: - type: string + type: string forth_property: $ref: '#/components/schemas/AnyValue' - + AnyValue: description: Tests support for https://swagger.io/docs/specification/data-models/data-types/#any - + OneOfAdditionalProps: type: object properties: diff --git a/src/test/resources/examples/anyOfOneOfAllOf/models/Models.kt b/src/test/resources/examples/anyOfOneOfAllOf/models/Models.kt index 248d9703..293d0f2d 100644 --- a/src/test/resources/examples/anyOfOneOfAllOf/models/Models.kt +++ b/src/test/resources/examples/anyOfOneOfAllOf/models/Models.kt @@ -102,5 +102,8 @@ data class SecondOneB( data class SimpleOneOfs( @param:JsonProperty("oneof_property") @get:JsonProperty("oneof_property") - val oneofProperty: Any? = null + val oneofProperty: Any? = null, + @param:JsonProperty("primitive_oneof_property") + @get:JsonProperty("primitive_oneof_property") + val primitiveOneofProperty: Any? = null )