Skip to content
This repository was archived by the owner on Mar 16, 2025. It is now read-only.

Commit fa27384

Browse files
committed
#45, wrap with null type
1 parent d995c7f commit fa27384

File tree

3 files changed

+147
-0
lines changed

3 files changed

+147
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright 2020 https://github.com/openapi-processor/openapi-processor-core
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.converter.wrapper
7+
8+
import io.openapiprocessor.core.converter.ApiOptions
9+
import io.openapiprocessor.core.converter.SchemaInfo
10+
import io.openapiprocessor.core.converter.mapping.MappingFinder
11+
import io.openapiprocessor.core.converter.mapping.TargetType
12+
import io.openapiprocessor.core.model.datatypes.DataType
13+
import io.openapiprocessor.core.model.datatypes.NoneDataType
14+
import io.openapiprocessor.core.model.datatypes.NullDataType
15+
16+
/**
17+
* wraps a data type in [io.openapiprocessor.core.model.datatypes.NullDataType].
18+
*/
19+
class NullDataTypeWrapper(
20+
private val options: ApiOptions,
21+
private val finder: MappingFinder = MappingFinder(options.typeMappings)
22+
) {
23+
24+
/**
25+
* wraps any data type with the configured null data type like
26+
* `org.openapitools.jackson.nullable.JsonNullable`.
27+
*
28+
* @param dataType the data type to wrap
29+
* @param schemaInfo the open api type with context information
30+
* @return the resulting java data type
31+
*/
32+
fun wrap(dataType: DataType, schemaInfo: SchemaInfo): DataType {
33+
val targetType = getNullDataType(schemaInfo)
34+
if (targetType == null) {
35+
return dataType
36+
}
37+
38+
val wrappedType = NullDataType (
39+
targetType.getName(),
40+
targetType.getPkg(),
41+
checkNone (dataType)
42+
)
43+
44+
return wrappedType
45+
}
46+
47+
private fun getNullDataType(info: SchemaInfo): TargetType? {
48+
// check endpoint result mapping
49+
return finder.findEndpointNullTypeMapping(info)?.getTargetType()
50+
51+
// not yet supported
52+
// check global result mapping
53+
// return finder.findNullTypeMapping()?.getTargetType()
54+
}
55+
56+
private fun checkNone(dataType: DataType): DataType {
57+
if (dataType is NoneDataType) {
58+
return dataType.wrappedInResult ()
59+
}
60+
61+
return dataType
62+
}
63+
64+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright 2021 https://github.com/openapi-processor/openapi-processor-core
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.model.datatypes
7+
8+
/**
9+
* Null(able) data type wrapper. Assumes a single generic parameter.
10+
*/
11+
class NullDataType(
12+
private val type: String,
13+
private val pkg: String,
14+
private val dataType: DataType
15+
): DataType {
16+
17+
override fun getName(): String {
18+
return "$type<${dataType.getName()}>"
19+
}
20+
21+
override fun getPackageName(): String {
22+
return pkg
23+
}
24+
25+
override fun getImports(): Set<String> {
26+
return setOf("${getPackageName()}.$type") + dataType.getImports()
27+
}
28+
29+
override fun getReferencedImports(): Set<String> {
30+
return emptySet()
31+
}
32+
33+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright 2020 https://github.com/openapi-processor/openapi-processor-core
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.converter.wrapper
7+
8+
import io.kotest.core.spec.style.StringSpec
9+
import io.kotest.matchers.shouldBe
10+
import io.kotest.matchers.types.shouldBeSameInstanceAs
11+
import io.mockk.every
12+
import io.mockk.mockk
13+
import io.openapiprocessor.core.converter.ApiOptions
14+
import io.openapiprocessor.core.converter.SchemaInfo
15+
import io.openapiprocessor.core.converter.mapping.MappingFinder
16+
import io.openapiprocessor.core.converter.mapping.TypeMapping
17+
import io.openapiprocessor.core.model.datatypes.StringDataType
18+
import io.openapiprocessor.core.parser.RefResolver
19+
20+
class NullDataTypeWrapperSpec : StringSpec({
21+
val resolver = mockk<RefResolver>()
22+
23+
"does not wrap datatype if there is no null mapping" {
24+
val finder = mockk<MappingFinder>()
25+
every { finder.findEndpointNullTypeMapping(any()) } returns null
26+
27+
val wrapper = NullDataTypeWrapper(ApiOptions(), finder)
28+
29+
val info = SchemaInfo("/any", "", "", null, resolver)
30+
val dataType = StringDataType()
31+
32+
wrapper.wrap(dataType, info).shouldBeSameInstanceAs(dataType)
33+
}
34+
35+
"does wrap datatype if there is a null mapping" {
36+
val finder = mockk<MappingFinder>()
37+
every { finder.findEndpointNullTypeMapping(any()) } returns TypeMapping(
38+
"null", "org.openapitools.jackson.nullable.JsonNullable")
39+
40+
val wrapper = NullDataTypeWrapper(ApiOptions(), finder)
41+
42+
val info = SchemaInfo("/any", "", "", null, resolver)
43+
val dataType = StringDataType()
44+
45+
val result = wrapper.wrap(dataType, info)
46+
result.getName().shouldBe("JsonNullable<String>")
47+
result.getPackageName().shouldBe("org.openapitools.jackson.nullable")
48+
}
49+
50+
})

0 commit comments

Comments
 (0)