Skip to content

Commit

Permalink
Support oneOf of primitives. (#142)
Browse files Browse the repository at this point in the history
* Support oneOf of primitives.

* code clarity improvement

* revert formatting
  • Loading branch information
cjbooms authored Jul 29, 2022
1 parent 94b837f commit 10afd15
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 8 deletions.
10 changes: 7 additions & 3 deletions src/main/kotlin/com/cjbooms/fabrikt/model/OasType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")
Expand Down Expand Up @@ -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 ->
Expand Down
17 changes: 13 additions & 4 deletions src/test/resources/examples/anyOfOneOfAllOf/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
5 changes: 4 additions & 1 deletion src/test/resources/examples/anyOfOneOfAllOf/models/Models.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)

0 comments on commit 10afd15

Please sign in to comment.