17
17
package za .co .absa .springdocopenapiscala
18
18
19
19
import io .swagger .v3 .oas .models .Components
20
- import io .swagger .v3 .oas .models .media .{Discriminator , Schema }
20
+ import io .swagger .v3 .oas .models .media .{ArraySchema , BooleanSchema , Discriminator , IntegerSchema , NumberSchema , ObjectSchema , Schema , StringSchema , UUIDSchema }
21
21
22
22
import java .time .{Instant , LocalDate , LocalDateTime , LocalTime , ZonedDateTime }
23
23
import java .util .UUID
@@ -27,6 +27,7 @@ import scala.reflect.runtime.universe._
27
27
import OpenAPIModelRegistration ._
28
28
29
29
import java .sql .Timestamp
30
+ import scala .collection .Seq
30
31
31
32
class OpenAPIModelRegistration (
32
33
components : Components ,
@@ -69,7 +70,7 @@ class OpenAPIModelRegistration(
69
70
handleType(tpe)
70
71
}
71
72
72
- private case class OpenAPISimpleType (tpe : String , format : Option [String ] = None )
73
+ private case class OpenAPISimpleType (schema : Schema [_] , format : Option [ String ] = None , _type : Option [String ] = None )
73
74
74
75
@ tailrec
75
76
private def handleType (tpe : Type ): Schema [_] = {
@@ -96,8 +97,7 @@ class OpenAPIModelRegistration(
96
97
97
98
private def handleCaseType (tpe : Type ): Schema [_] = {
98
99
val name = tpe.typeSymbol.name.toString.trim
99
- val schema = new Schema
100
- schema.setType(" object" )
100
+ val schema = new ObjectSchema
101
101
val fields = tpe.decls.collect {
102
102
case field : TermSymbol if field.isVal => field
103
103
}
@@ -114,17 +114,15 @@ class OpenAPIModelRegistration(
114
114
115
115
private def handleMap (keyType : Type , valueType : Type ): Schema [_] = keyType match {
116
116
case _ if keyType <:< typeOf[String ] =>
117
- val schema = new Schema
118
- schema.setType(" object" )
117
+ val schema = new ObjectSchema
119
118
schema.setAdditionalProperties(handleType(valueType))
120
119
schema
121
120
case _ => throw new IllegalArgumentException (" In OpenAPI 3.0.x Map must have String key type." )
122
121
}
123
122
124
123
private def handleSeqLike (tpe : Type ): Schema [_] = {
125
- val schema = new Schema
124
+ val schema = new ArraySchema
126
125
val innerSchema = handleType(tpe.typeArgs.head)
127
- schema.setType(" array" )
128
126
schema.setItems(innerSchema)
129
127
schema
130
128
}
@@ -139,8 +137,7 @@ class OpenAPIModelRegistration(
139
137
val enumValues = parentObjectType.members.filter(isSymbolEnumerationValue)
140
138
val enumValuesAsStrings = enumValues.map(_.name.toString.trim)
141
139
142
- val schema = new Schema [String ]
143
- schema.setType(" string" )
140
+ val schema = new StringSchema
144
141
schema.setEnum(enumValuesAsStrings.toList.asJava)
145
142
schema
146
143
}
@@ -224,33 +221,39 @@ class OpenAPIModelRegistration(
224
221
}
225
222
226
223
private def handleSimpleType (tpe : Type ): Schema [_] = {
227
- val schema = new Schema
228
- val OpenAPISimpleType (terminalTpe, format) = getOpenAPISimpleType(tpe)
229
- schema.setType(terminalTpe)
230
- format.foreach(f => schema.setFormat(f))
231
- schema
224
+ val simpleType = getOpenAPISimpleType(tpe)
225
+ simpleType.format.foreach(simpleType.schema.setFormat)
226
+ simpleType._type.foreach(simpleType.schema.setType)
227
+ simpleType.schema
232
228
}
233
229
234
230
private def getOpenAPISimpleType (tpe : Type ): OpenAPISimpleType = tpe.dealias match {
235
- case t if t =:= typeOf[Byte ] => OpenAPISimpleType (" integer" , Some (" int32" ))
236
- case t if t =:= typeOf[Short ] => OpenAPISimpleType (" integer" , Some (" int32" ))
237
- case t if t =:= typeOf[Int ] => OpenAPISimpleType (" integer" , Some (" int32" ))
238
- case t if t =:= typeOf[Long ] => OpenAPISimpleType (" integer" , Some (" int64" ))
239
- case t if t =:= typeOf[Float ] => OpenAPISimpleType (" number" , Some (" float" ))
240
- case t if t =:= typeOf[Double ] => OpenAPISimpleType (" number" , Some (" double" ))
241
- case t if t =:= typeOf[Char ] => OpenAPISimpleType (" string" )
242
- case t if t =:= typeOf[String ] => OpenAPISimpleType (" string" )
243
- case t if t =:= typeOf[UUID ] => OpenAPISimpleType (" string" , Some (" uuid" ))
244
- case t if t =:= typeOf[Boolean ] => OpenAPISimpleType (" boolean" )
245
- case t if t =:= typeOf[Unit ] => OpenAPISimpleType (" null" )
246
- case t if t =:= typeOf[ZonedDateTime ] => OpenAPISimpleType (" string" , Some (" date-time" ))
247
- case t if t =:= typeOf[Instant ] => OpenAPISimpleType (" string" , Some (" date-time" ))
248
- case t if t =:= typeOf[LocalDateTime ] => OpenAPISimpleType (" string" , Some (" date-time" ))
249
- case t if t =:= typeOf[LocalDate ] => OpenAPISimpleType (" string" , Some (" date" ))
250
- case t if t =:= typeOf[LocalTime ] => OpenAPISimpleType (" string" , Some (" time" ))
251
- case t if t =:= typeOf[Timestamp ] => OpenAPISimpleType (" string" , Some (" date-time" ))
252
- case t if t =:= typeOf[BigDecimal ] => OpenAPISimpleType (" number" )
253
- case t if t =:= typeOf[BigInt ] => OpenAPISimpleType (" integer" )
231
+ case t if t =:= typeOf[Byte ] || t =:= typeOf[Short ] || t =:= typeOf[Int ] =>
232
+ OpenAPISimpleType (new IntegerSchema ())
233
+ case t if t =:= typeOf[Long ] =>
234
+ OpenAPISimpleType (new IntegerSchema (), Some (" int64" ))
235
+ case t if t =:= typeOf[Float ] =>
236
+ OpenAPISimpleType (new NumberSchema (), Some (" float" ))
237
+ case t if t =:= typeOf[Double ] =>
238
+ OpenAPISimpleType (new NumberSchema (), Some (" double" ))
239
+ case t if t =:= typeOf[Char ] || t =:= typeOf[String ] =>
240
+ OpenAPISimpleType (new StringSchema ())
241
+ case t if t =:= typeOf[UUID ] =>
242
+ OpenAPISimpleType (new UUIDSchema ())
243
+ case t if t =:= typeOf[Boolean ] =>
244
+ OpenAPISimpleType (new BooleanSchema ())
245
+ case t if t =:= typeOf[Unit ] =>
246
+ OpenAPISimpleType (new Schema , None , Some (" null" ))
247
+ case t if t =:= typeOf[ZonedDateTime ] || t =:= typeOf[Instant ] || t =:= typeOf[LocalDateTime ] || t =:= typeOf[Timestamp ] =>
248
+ OpenAPISimpleType (new StringSchema (), Some (" date-time" ))
249
+ case t if t =:= typeOf[LocalDate ] =>
250
+ OpenAPISimpleType (new StringSchema (), Some (" date" ))
251
+ case t if t =:= typeOf[LocalTime ] =>
252
+ OpenAPISimpleType (new StringSchema (), Some (" time" ))
253
+ case t if t =:= typeOf[BigDecimal ] =>
254
+ OpenAPISimpleType (new NumberSchema ())
255
+ case t if t =:= typeOf[BigInt ] =>
256
+ OpenAPISimpleType (new IntegerSchema (), Some (null ))
254
257
}
255
258
256
259
private def registerAsReference (name : String , schema : Schema [_]): Schema [_] = {
0 commit comments