Skip to content

Commit e4df4fd

Browse files
committed
1 parent fa72a4b commit e4df4fd

File tree

6 files changed

+103
-17
lines changed

6 files changed

+103
-17
lines changed

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/converter/ApiOptions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ApiOptions {
5252
var modelType = "default"
5353

5454
/**
55-
* enum type. default|string|framework.
55+
* enum type. default|string|supplier.
5656
*/
5757
var enumType = "default"
5858

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/writer/java/StringEnumWriter.kt

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55

66
package io.openapiprocessor.core.writer.java
77

8+
import io.openapiprocessor.core.converter.ApiOptions
89
import io.openapiprocessor.core.model.datatypes.DataType
910
import io.openapiprocessor.core.model.datatypes.StringEnumDataType
1011
import java.io.Writer
1112

1213
/**
1314
* Writer for String enum.
1415
*/
15-
open class StringEnumWriter(private val generatedWriter: GeneratedWriter) {
16+
open class StringEnumWriter(private val apiOptions: ApiOptions, private val generatedWriter: GeneratedWriter) {
1617

1718
fun write(target: Writer, dataType: StringEnumDataType) {
1819
target.write("package ${dataType.getPackageName()};\n\n")
@@ -27,7 +28,11 @@ open class StringEnumWriter(private val generatedWriter: GeneratedWriter) {
2728

2829
generatedWriter.writeUse(target)
2930
target.write("\n")
30-
target.write("public enum ${dataType.getTypeName()} {\n")
31+
target.write("public enum ${dataType.getTypeName()}")
32+
if (isSupplier()) {
33+
target.write(" implements Supplier<String>")
34+
}
35+
target.write(" {\n")
3136

3237
val values = mutableListOf<String>()
3338
dataType.values.forEach {
@@ -45,15 +50,29 @@ open class StringEnumWriter(private val generatedWriter: GeneratedWriter) {
4550
|
4651
""".trimMargin())
4752

48-
target.write(
49-
"""
50-
| @JsonValue
51-
| public String getValue() {
52-
| return this.value;
53-
| }
54-
|
55-
|
56-
""".trimMargin())
53+
if(isSupplier()) {
54+
target.write(
55+
"""
56+
| @JsonValue
57+
| public String get() {
58+
| return this.value;
59+
| }
60+
|
61+
|
62+
""".trimMargin())
63+
64+
} else {
65+
// default
66+
target.write(
67+
"""
68+
| @JsonValue
69+
| public String getValue() {
70+
| return this.value;
71+
| }
72+
|
73+
|
74+
""".trimMargin())
75+
}
5776

5877
target.write(
5978
"""
@@ -78,10 +97,16 @@ open class StringEnumWriter(private val generatedWriter: GeneratedWriter) {
7897
imports.add ("com.fasterxml.jackson.annotation.JsonValue")
7998
imports.add(generatedWriter.getImport())
8099
imports.addAll (dataType.referencedImports)
100+
if (isSupplier()) {
101+
imports.add ("java.util.function.Supplier")
102+
}
81103

82104
return DefaultImportFilter ()
83105
.filter(packageName, imports)
84106
.sorted()
85107
}
86108

109+
private fun isSupplier(): Boolean {
110+
return apiOptions.enumType == "supplier"
111+
}
87112
}

openapi-processor-core/src/main/resources/mapping/v5/mapping.example.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ options: # general processor options [required]
2525
# default (i.e pojo) or record
2626
model-type: default
2727

28-
# default, string, framework
28+
# default, string, supplier
2929
enum-type: default
3030

3131
# generate common interface for an `oneOf` object list (optional): true or false (default)

openapi-processor-core/src/main/resources/mapping/v5/mapping.yaml.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@
5454
"enum": ["default", "record"]
5555
},
5656
"enum-type": {
57-
"description": "generate default, string or framework specific enum. Default is default.",
57+
"description": "generate default enum, string or supplier enum. Default is default.",
5858
"default": "default",
59-
"enum": ["default", "string", "framework"]
59+
"enum": ["default", "string", "supplier"]
6060
},
6161
"one-of-interface": {
6262
"description": "generate common interface for a `oneOf` object list.",

openapi-processor-core/src/test/groovy/com/github/hauner/openapi/core/writer/java/StringEnumWriterSpec.groovy

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import spock.lang.Specification
1515
class StringEnumWriterSpec extends Specification {
1616
def options = new ApiOptions()
1717
def generatedWriter = new SimpleGeneratedWriter(options)
18-
def writer = new StringEnumWriter(generatedWriter)
18+
def writer = new StringEnumWriter(options, generatedWriter)
1919
def target = new StringWriter ()
2020

2121
void "writes 'package'" () {
@@ -69,6 +69,46 @@ public enum $type {
6969
'Foo' | 'FooX'
7070
}
7171

72+
void "writes Supplier import" () {
73+
options.enumType = "supplier"
74+
75+
def dataType = new StringEnumDataType(
76+
new DataTypeName('Foo'), 'pkg', [], null, false)
77+
78+
when:
79+
writer.write (target, dataType)
80+
81+
then:
82+
target.toString ().contains ("""\
83+
import java.util.function.Supplier;
84+
""")
85+
}
86+
87+
void "writes enum class implementing Supplier<String>"() {
88+
options.enumType = "supplier"
89+
90+
def pkg = 'com.github.hauner.openapi'
91+
def dataType = new StringEnumDataType(
92+
new DataTypeName(id, type), pkg, [], null, false)
93+
94+
when:
95+
writer.write (target, dataType)
96+
97+
then:
98+
target.toString ().contains ("""\
99+
@Generated
100+
public enum $type implements Supplier<String> {
101+
""")
102+
target.toString ().contains ("""\
103+
}
104+
""")
105+
106+
where:
107+
id | type
108+
'Foo' | 'Foo'
109+
'Foo' | 'FooX'
110+
}
111+
72112
void "writes enum values"() {
73113
def pkg = 'com.github.hauner.openapi'
74114
def dataType = new StringEnumDataType(
@@ -141,6 +181,27 @@ public enum Foo {
141181
return this.value;
142182
}
143183
184+
""")
185+
}
186+
187+
void "writes @JsonValue & Supplier<> method for serialization"() {
188+
options.enumType = "supplier"
189+
190+
def pkg = 'com.github.hauner.openapi'
191+
def dataType = new StringEnumDataType (
192+
new DataTypeName('Foo'), pkg, ['foo', '_foo-2', 'foo-foo'], null, false)
193+
194+
when:
195+
writer.write (target, dataType)
196+
197+
then:
198+
target.toString ().contains ("""\
199+
200+
@JsonValue
201+
public String get() {
202+
return this.value;
203+
}
204+
144205
""")
145206
}
146207

openapi-processor-core/src/testInt/kotlin/io/openapiprocessor/core/TestProcessor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class TestProcessor:
8181
javaDocWriter
8282
)
8383
},
84-
StringEnumWriter(generatedWriter),
84+
StringEnumWriter(options, generatedWriter),
8585
InterfaceDataTypeWriter(
8686
options,
8787
generatedWriter,

0 commit comments

Comments
 (0)