Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable more projects for scala3 #1315

Merged
merged 22 commits into from
Jun 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -7,7 +7,7 @@ case class Schema(
allOf: List[ReferenceOr[Schema]] = List.empty,
title: Option[String] = None,
required: List[String] = List.empty,
`type`: Option[SchemaType.SchemaType] = None,
`type`: Option[SchemaType] = None,
items: Option[ReferenceOr[Schema]] = None,
properties: ListMap[String, ReferenceOr[Schema]] = ListMap.empty,
description: Option[String] = None,
Expand All @@ -30,28 +30,27 @@ case class Schema(
exclusiveMaximum: Option[Boolean] = None,
minItems: Option[Int] = None,
maxItems: Option[Int] = None,
enum: Option[List[ExampleSingleValue]] = None,
`enum`: Option[List[ExampleSingleValue]] = None,
extensions: ListMap[String, ExtensionValue] = ListMap.empty
)

case class Discriminator(propertyName: String, mapping: Option[ListMap[String, String]])

object Schema {
def apply(`type`: SchemaType.SchemaType): Schema = new Schema(`type` = Some(`type`))
def apply(`type`: SchemaType): Schema = new Schema(`type` = Some(`type`))

def apply(references: List[ReferenceOr[Schema]], discriminator: Option[Discriminator]): Schema =
new Schema(oneOf = references, discriminator = discriminator)
}

object SchemaType extends Enumeration {
type SchemaType = Value

val Boolean: Value = Value("boolean")
val Object: Value = Value("object")
val Array: Value = Value("array")
val Number: Value = Value("number")
val String: Value = Value("string")
val Integer: Value = Value("integer")
sealed abstract class SchemaType(val value: String)
object SchemaType {
case object Boolean extends SchemaType("boolean")
case object Object extends SchemaType("object")
case object Array extends SchemaType("array")
case object Number extends SchemaType("number")
case object String extends SchemaType("string")
case object Integer extends SchemaType("integer")
}

object SchemaFormat {
Expand Down
@@ -1,11 +1,9 @@
package sttp.tapir.asyncapi

import io.circe.generic.encoding.DerivedAsObjectEncoder
import io.circe.generic.semiauto._
import io.circe.parser._
import io.circe.syntax._
import io.circe.{Encoder, Json, JsonObject}
import shapeless.Lazy
import sttp.tapir.apispec.{
Discriminator,
ExampleMultipleValue,
Expand Down Expand Up @@ -36,9 +34,9 @@ trait TapirAsyncAPICirceEncoders {
}

implicit val docsExtensionValue: Encoder[ExtensionValue] = Encoder.instance(e => parse(e.value).getOrElse(Json.fromString(e.value)))
implicit val encoderOAuthFlow: Encoder[OAuthFlow] = deriveWithExtensions[OAuthFlow]
implicit val encoderOAuthFlows: Encoder[OAuthFlows] = deriveWithExtensions[OAuthFlows]
implicit val encoderSecurityScheme: Encoder[SecurityScheme] = deriveWithExtensions[SecurityScheme]
implicit val encoderOAuthFlow: Encoder[OAuthFlow] = deriveEncoder[OAuthFlow].mapJsonObject(expandExtensions)
implicit val encoderOAuthFlows: Encoder[OAuthFlows] = deriveEncoder[OAuthFlows].mapJsonObject(expandExtensions)
implicit val encoderSecurityScheme: Encoder[SecurityScheme] = deriveEncoder[SecurityScheme].mapJsonObject(expandExtensions)
implicit val encoderExampleSingleValue: Encoder[ExampleSingleValue] = {
case ExampleSingleValue(value: String) => parse(value).getOrElse(Json.fromString(value))
case ExampleSingleValue(value: Int) => Json.fromInt(value)
Expand All @@ -55,18 +53,19 @@ trait TapirAsyncAPICirceEncoders {
case e: ExampleSingleValue => encoderExampleSingleValue(e)
case ExampleMultipleValue(values) => Json.arr(values.map(v => encoderExampleSingleValue(ExampleSingleValue(v))): _*)
}
implicit val encoderSchemaType: Encoder[SchemaType.SchemaType] = Encoder.encodeEnumeration(SchemaType)
implicit val encoderSchema: Encoder[Schema] = deriveWithExtensions[Schema]
implicit val encoderSchemaType: Encoder[SchemaType] = { e => Encoder.encodeString(e.value) }
implicit val encoderSchema: Encoder[Schema] = deriveEncoder[Schema].mapJsonObject(expandExtensions)
implicit val encoderReference: Encoder[Reference] = deriveEncoder[Reference]
implicit val encoderDiscriminator: Encoder[Discriminator] = deriveEncoder[Discriminator]
implicit val encoderExternalDocumentation: Encoder[ExternalDocumentation] = deriveWithExtensions[ExternalDocumentation]
implicit val encoderTag: Encoder[Tag] = deriveWithExtensions[Tag]
implicit val encoderExternalDocumentation: Encoder[ExternalDocumentation] =
deriveEncoder[ExternalDocumentation].mapJsonObject(expandExtensions)
implicit val encoderTag: Encoder[Tag] = deriveEncoder[Tag].mapJsonObject(expandExtensions)

implicit val encoderAnyValue: Encoder[AnyValue] = (av: AnyValue) => {
parse(av.value).getOrElse(Json.fromString(av.value))
}
implicit val encoderCorrelationId: Encoder[CorrelationId] = deriveWithExtensions[CorrelationId]
implicit val encoderParameter: Encoder[Parameter] = deriveWithExtensions[Parameter]
implicit val encoderCorrelationId: Encoder[CorrelationId] = deriveEncoder[CorrelationId].mapJsonObject(expandExtensions)
implicit val encoderParameter: Encoder[Parameter] = deriveEncoder[Parameter].mapJsonObject(expandExtensions)

implicit val encoderMessageBinding: Encoder[List[MessageBinding]] = {
implicit val encoderHttpMessageBinding: Encoder[HttpMessageBinding] = deriveEncoder[HttpMessageBinding]
Expand Down Expand Up @@ -140,24 +139,24 @@ trait TapirAsyncAPICirceEncoders {
case Some(Right(s)) => encoderReferenceOr[Schema].apply(s)
}

implicit val encoderMessageTrait: Encoder[MessageTrait] = deriveWithExtensions[MessageTrait]
implicit val encoderSingleMessage: Encoder[SingleMessage] = deriveWithExtensions[SingleMessage]
implicit val encoderMessageTrait: Encoder[MessageTrait] = deriveEncoder[MessageTrait].mapJsonObject(expandExtensions)
implicit val encoderSingleMessage: Encoder[SingleMessage] = deriveEncoder[SingleMessage].mapJsonObject(expandExtensions)
implicit val encoderOneOfMessage: Encoder[OneOfMessage] = deriveEncoder[OneOfMessage]
implicit val encoderMessage: Encoder[Message] = {
case s: SingleMessage => encoderSingleMessage.apply(s)
case o: OneOfMessage => encoderOneOfMessage.apply(o)
}

implicit val encoderOperationTrait: Encoder[OperationTrait] = deriveWithExtensions[OperationTrait]
implicit val encoderOperation: Encoder[Operation] = deriveWithExtensions[Operation]
implicit val encoderChannelItem: Encoder[ChannelItem] = deriveWithExtensions[ChannelItem]
implicit val encoderComponents: Encoder[Components] = deriveWithExtensions[Components]
implicit val encoderServerVariable: Encoder[ServerVariable] = deriveWithExtensions[ServerVariable]
implicit val encoderServer: Encoder[Server] = deriveWithExtensions[Server]
implicit val encoderContact: Encoder[Contact] = deriveWithExtensions[Contact]
implicit val encoderLicense: Encoder[License] = deriveWithExtensions[License]
implicit val encoderInfo: Encoder[Info] = deriveWithExtensions[Info]
implicit val encoderAsyncAPI: Encoder[AsyncAPI] = deriveWithExtensions[AsyncAPI]
implicit val encoderOperationTrait: Encoder[OperationTrait] = deriveEncoder[OperationTrait].mapJsonObject(expandExtensions)
implicit val encoderOperation: Encoder[Operation] = deriveEncoder[Operation].mapJsonObject(expandExtensions)
implicit val encoderChannelItem: Encoder[ChannelItem] = deriveEncoder[ChannelItem].mapJsonObject(expandExtensions)
implicit val encoderComponents: Encoder[Components] = deriveEncoder[Components].mapJsonObject(expandExtensions)
implicit val encoderServerVariable: Encoder[ServerVariable] = deriveEncoder[ServerVariable].mapJsonObject(expandExtensions)
implicit val encoderServer: Encoder[Server] = deriveEncoder[Server].mapJsonObject(expandExtensions)
implicit val encoderContact: Encoder[Contact] = deriveEncoder[Contact].mapJsonObject(expandExtensions)
implicit val encoderLicense: Encoder[License] = deriveEncoder[License].mapJsonObject(expandExtensions)
implicit val encoderInfo: Encoder[Info] = deriveEncoder[Info].mapJsonObject(expandExtensions)
implicit val encoderAsyncAPI: Encoder[AsyncAPI] = deriveEncoder[AsyncAPI].mapJsonObject(expandExtensions)

implicit def encodeList[T: Encoder]: Encoder[List[T]] = {
case Nil => Json.Null
Expand All @@ -178,8 +177,4 @@ trait TapirAsyncAPICirceEncoders {
val jsonWithoutExt = jsonObject.filterKeys(_ != "extensions")
extensions.flatMap(_.asObject).map(extObject => extObject.deepMerge(jsonWithoutExt)).getOrElse(jsonWithoutExt)
}

private def deriveWithExtensions[A](implicit encode: Lazy[DerivedAsObjectEncoder[A]]) = {
deriveEncoder[A].mapJsonObject(expandExtensions)
}
}
Expand Up @@ -63,7 +63,7 @@ case class Server(
extensions: ListMap[String, ExtensionValue] = ListMap.empty
)
case class ServerVariable(
enum: List[String],
`enum`: List[String],
default: Option[String],
description: Option[String],
examples: List[String],
Expand Down
@@ -1,11 +1,9 @@
package sttp.tapir.openapi

import io.circe.generic.encoding.DerivedAsObjectEncoder
import io.circe.generic.semiauto._
import io.circe.parser._
import io.circe.syntax._
import io.circe.{Encoder, Json, JsonObject}
import shapeless.Lazy
import sttp.tapir.apispec.{
Discriminator,
ExampleMultipleValue,
Expand Down Expand Up @@ -36,9 +34,9 @@ trait TapirOpenAPICirceEncoders {
}

implicit val extensionValue: Encoder[ExtensionValue] = Encoder.instance(e => parse(e.value).getOrElse(Json.fromString(e.value)))
implicit val encoderOAuthFlow: Encoder[OAuthFlow] = deriveWithExtensions[OAuthFlow]
implicit val encoderOAuthFlows: Encoder[OAuthFlows] = deriveWithExtensions[OAuthFlows]
implicit val encoderSecurityScheme: Encoder[SecurityScheme] = deriveWithExtensions[SecurityScheme]
implicit val encoderOAuthFlow: Encoder[OAuthFlow] = deriveEncoder[OAuthFlow].mapJsonObject(expandExtensions)
implicit val encoderOAuthFlows: Encoder[OAuthFlows] = deriveEncoder[OAuthFlows].mapJsonObject(expandExtensions)
implicit val encoderSecurityScheme: Encoder[SecurityScheme] = deriveEncoder[SecurityScheme].mapJsonObject(expandExtensions)
implicit val encoderExampleSingleValue: Encoder[ExampleSingleValue] = {
case ExampleSingleValue(value: String) => parse(value).getOrElse(Json.fromString(value))
case ExampleSingleValue(value: Int) => Json.fromInt(value)
Expand All @@ -55,18 +53,18 @@ trait TapirOpenAPICirceEncoders {
case e: ExampleSingleValue => encoderExampleSingleValue(e)
case ExampleMultipleValue(values) => Json.arr(values.map(v => encoderExampleSingleValue(ExampleSingleValue(v))): _*)
}
implicit val encoderSchemaType: Encoder[SchemaType.SchemaType] = Encoder.encodeEnumeration(SchemaType)
implicit val encoderSchema: Encoder[Schema] = deriveWithExtensions[Schema]
implicit val encoderSchemaType: Encoder[SchemaType] = { e => Encoder.encodeString(e.value) }
implicit val encoderSchema: Encoder[Schema] = deriveEncoder[Schema].mapJsonObject(expandExtensions)
implicit val encoderReference: Encoder[Reference] = deriveEncoder[Reference]
implicit val encoderHeader: Encoder[Header] = deriveEncoder[Header]
implicit val encoderExample: Encoder[Example] = deriveWithExtensions[Example]
implicit val encoderResponse: Encoder[Response] = deriveWithExtensions[Response]
implicit val encoderEncoding: Encoder[Encoding] = deriveWithExtensions[Encoding]
implicit val encoderMediaType: Encoder[MediaType] = deriveWithExtensions[MediaType]
implicit val encoderRequestBody: Encoder[RequestBody] = deriveWithExtensions[RequestBody]
implicit val encoderParameterStyle: Encoder[ParameterStyle.ParameterStyle] = Encoder.encodeEnumeration(ParameterStyle)
implicit val encoderParameterIn: Encoder[ParameterIn.ParameterIn] = Encoder.encodeEnumeration(ParameterIn)
implicit val encoderParameter: Encoder[Parameter] = deriveWithExtensions[Parameter]
implicit val encoderExample: Encoder[Example] = deriveEncoder[Example].mapJsonObject(expandExtensions)
implicit val encoderResponse: Encoder[Response] = deriveEncoder[Response].mapJsonObject(expandExtensions)
implicit val encoderEncoding: Encoder[Encoding] = deriveEncoder[Encoding].mapJsonObject(expandExtensions)
implicit val encoderMediaType: Encoder[MediaType] = deriveEncoder[MediaType].mapJsonObject(expandExtensions)
implicit val encoderRequestBody: Encoder[RequestBody] = deriveEncoder[RequestBody].mapJsonObject(expandExtensions)
implicit val encoderParameterStyle: Encoder[ParameterStyle] = { e => Encoder.encodeString(e.value) }
implicit val encoderParameterIn: Encoder[ParameterIn] = { e => Encoder.encodeString(e.value) }
implicit val encoderParameter: Encoder[Parameter] = deriveEncoder[Parameter].mapJsonObject(expandExtensions)
implicit val encoderResponseMap: Encoder[ListMap[ResponsesKey, ReferenceOr[Response]]] =
(responses: ListMap[ResponsesKey, ReferenceOr[Response]]) => {
val fields = responses.map {
Expand All @@ -85,23 +83,24 @@ trait TapirOpenAPICirceEncoders {
// this is needed to override the encoding of `security: List[SecurityRequirement]`. An empty security requirement
// should be represented as an empty object (`{}`), not `null`, which is the default encoding of `ListMap`s.
implicit def encodeListMap[V: Encoder]: Encoder[ListMap[String, V]] = doEncodeListMap(nullWhenEmpty = false)
deriveWithExtensions[Operation]
deriveEncoder[Operation].mapJsonObject(expandExtensions)
}
implicit val encoderPathItem: Encoder[PathItem] = deriveWithExtensions[PathItem]
implicit val encoderPathItem: Encoder[PathItem] = deriveEncoder[PathItem].mapJsonObject(expandExtensions)
implicit val encoderPaths: Encoder[Paths] = Encoder.instance { paths =>
val extensions = paths.extensions.asJsonObject
val pathItems = paths.pathItems.asJson
pathItems.asObject.map(_.deepMerge(extensions).asJson).getOrElse(pathItems)
}
implicit val encoderComponents: Encoder[Components] = deriveWithExtensions[Components]
implicit val encoderServerVariable: Encoder[ServerVariable] = deriveWithExtensions[ServerVariable]
implicit val encoderServer: Encoder[Server] = deriveWithExtensions[Server]
implicit val encoderExternalDocumentation: Encoder[ExternalDocumentation] = deriveWithExtensions[ExternalDocumentation]
implicit val encoderTag: Encoder[Tag] = deriveWithExtensions[Tag]
implicit val encoderInfo: Encoder[Info] = deriveWithExtensions[Info]
implicit val encoderContact: Encoder[Contact] = deriveWithExtensions[Contact]
implicit val encoderLicense: Encoder[License] = deriveWithExtensions[License]
implicit val encoderOpenAPI: Encoder[OpenAPI] = deriveWithExtensions[OpenAPI].mapJson(_.deepDropNullValues)
implicit val encoderComponents: Encoder[Components] = deriveEncoder[Components].mapJsonObject(expandExtensions)
implicit val encoderServerVariable: Encoder[ServerVariable] = deriveEncoder[ServerVariable].mapJsonObject(expandExtensions)
implicit val encoderServer: Encoder[Server] = deriveEncoder[Server].mapJsonObject(expandExtensions)
implicit val encoderExternalDocumentation: Encoder[ExternalDocumentation] =
deriveEncoder[ExternalDocumentation].mapJsonObject(expandExtensions)
implicit val encoderTag: Encoder[Tag] = deriveEncoder[Tag].mapJsonObject(expandExtensions)
implicit val encoderInfo: Encoder[Info] = deriveEncoder[Info].mapJsonObject(expandExtensions)
implicit val encoderContact: Encoder[Contact] = deriveEncoder[Contact].mapJsonObject(expandExtensions)
implicit val encoderLicense: Encoder[License] = deriveEncoder[License].mapJsonObject(expandExtensions)
implicit val encoderOpenAPI: Encoder[OpenAPI] = deriveEncoder[OpenAPI].mapJsonObject(expandExtensions).mapJson(_.deepDropNullValues)
implicit val encoderDiscriminator: Encoder[Discriminator] = deriveEncoder[Discriminator]
implicit def encodeList[T: Encoder]: Encoder[List[T]] = {
case Nil => Json.Null
Expand Down Expand Up @@ -151,8 +150,4 @@ trait TapirOpenAPICirceEncoders {
val jsonWithoutExt = jsonObject.filterKeys(_ != "extensions")
extensions.flatMap(_.asObject).map(extObject => extObject.deepMerge(jsonWithoutExt)).getOrElse(jsonWithoutExt)
}

private def deriveWithExtensions[A](implicit encode: Lazy[DerivedAsObjectEncoder[A]]) = {
deriveEncoder[A].mapJsonObject(expandExtensions)
}
}