/** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.12.14 * User agent: apibuilder app.apibuilder.io/apicollective/apibuilder-swagger/0.12.14/http4s_0_18 */ package io.apibuilder.swagger.v0.models { sealed trait ParameterOrRef extends _root_.scala.Product with _root_.scala.Serializable sealed trait ResponseOrRef extends _root_.scala.Product with _root_.scala.Serializable final case class Contact( name: _root_.scala.Option[String] = None, url: _root_.scala.Option[String] = None, email: _root_.scala.Option[String] = None ) final case class ExternalDocumentation( description: _root_.scala.Option[String] = None, url: String ) /** * TODO: Can this be a union type with items? * * @param items NOTE: This is required if type is 'array' */ final case class Header( description: _root_.scala.Option[String] = None, `type`: io.apibuilder.swagger.v0.models.ItemsType, format: _root_.scala.Option[io.apibuilder.swagger.v0.models.FormatType] = None, items: _root_.scala.Option[io.apibuilder.swagger.v0.models.Items] = None, collectionFormat: _root_.scala.Option[io.apibuilder.swagger.v0.models.CollectionFormatType] = None, default: _root_.scala.Option[Map[String, _root_.io.circe.Json]] = None, maximum: _root_.scala.Option[Long] = None, exclusiveMaximum: _root_.scala.Option[Boolean] = None, minimum: _root_.scala.Option[Long] = None, exclusiveMinimum: _root_.scala.Option[Boolean] = None, maxLength: _root_.scala.Option[Int] = None, minLength: _root_.scala.Option[Int] = None, pattern: _root_.scala.Option[String] = None, maxItems: _root_.scala.Option[Int] = None, minItems: _root_.scala.Option[Int] = None, uniqueItems: _root_.scala.Option[Boolean] = None, `enum`: _root_.scala.Option[Seq[Map[String, _root_.io.circe.Json]]] = None, multipleOf: _root_.scala.Option[Long] = None ) final case class Info( title: String, description: _root_.scala.Option[String] = None, termsOfService: _root_.scala.Option[String] = None, contact: _root_.scala.Option[io.apibuilder.swagger.v0.models.Contact] = None, license: _root_.scala.Option[io.apibuilder.swagger.v0.models.License] = None, version: String ) /** * @param items NOTE: This is required if type is 'array' */ final case class Items( `type`: io.apibuilder.swagger.v0.models.ItemsType, format: _root_.scala.Option[io.apibuilder.swagger.v0.models.FormatType] = None, items: _root_.scala.Option[io.apibuilder.swagger.v0.models.Items] = None, collectionFormat: _root_.scala.Option[io.apibuilder.swagger.v0.models.CollectionFormatType] = None, default: _root_.scala.Option[Map[String, _root_.io.circe.Json]] = None, maximum: _root_.scala.Option[Long] = None, exclusiveMaximum: _root_.scala.Option[Boolean] = None, minimum: _root_.scala.Option[Long] = None, exclusiveMinimum: _root_.scala.Option[Boolean] = None, maxLength: _root_.scala.Option[Int] = None, minLength: _root_.scala.Option[Int] = None, pattern: _root_.scala.Option[String] = None, maxItems: _root_.scala.Option[Int] = None, minItems: _root_.scala.Option[Int] = None, uniqueItems: _root_.scala.Option[Boolean] = None, `enum`: _root_.scala.Option[Seq[Map[String, _root_.io.circe.Json]]] = None, multipleOf: _root_.scala.Option[Long] = None ) final case class License( name: String, url: _root_.scala.Option[String] = None ) final case class Operation( tags: _root_.scala.Option[Seq[String]] = None, summary: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, externalDocs: _root_.scala.Option[io.apibuilder.swagger.v0.models.ExternalDocumentation] = None, operationId: _root_.scala.Option[String] = None, consumes: _root_.scala.Option[Seq[String]] = None, produces: _root_.scala.Option[Seq[String]] = None, parameters: _root_.scala.Option[Seq[io.apibuilder.swagger.v0.models.ParameterOrRef]] = None, responses: Map[String, io.apibuilder.swagger.v0.models.ResponseOrRef], schemes: _root_.scala.Option[Seq[String]] = None, deprecated: _root_.scala.Option[Boolean] = None, security: _root_.scala.Option[Seq[Map[String, Seq[String]]]] = None ) /** * TODO: This might need to be a complex union type, given the different * requirements based on the 'in' property. * http://swagger.io/specification/#parameterObject */ final case class Parameter( name: String, in: io.apibuilder.swagger.v0.models.ParameterInType, description: _root_.scala.Option[String] = None, required: Boolean, schema: _root_.scala.Option[io.apibuilder.swagger.v0.models.Schema] = None, `type`: _root_.scala.Option[String] = None, format: _root_.scala.Option[String] = None, allowEmptyValue: _root_.scala.Option[Boolean] = None, items: _root_.scala.Option[io.apibuilder.swagger.v0.models.Items] = None, collectionFormat: _root_.scala.Option[io.apibuilder.swagger.v0.models.CollectionFormatType] = None, default: _root_.scala.Option[Map[String, _root_.io.circe.Json]] = None, maximum: _root_.scala.Option[Long] = None, exclusiveMaximum: _root_.scala.Option[Boolean] = None, minimum: _root_.scala.Option[Long] = None, exclusiveMinimum: _root_.scala.Option[Boolean] = None, maxLength: _root_.scala.Option[Int] = None, minLength: _root_.scala.Option[Int] = None, pattern: _root_.scala.Option[String] = None, maxItems: _root_.scala.Option[Int] = None, minItems: _root_.scala.Option[Int] = None, uniqueItems: _root_.scala.Option[Boolean] = None, `enum`: _root_.scala.Option[Seq[Map[String, _root_.io.circe.Json]]] = None, multipleOf: _root_.scala.Option[Long] = None ) extends ParameterOrRef /** * @param ref TODO: Needs to be named '$ref' */ final case class PathItem( ref: _root_.scala.Option[String] = None, get: _root_.scala.Option[io.apibuilder.swagger.v0.models.Operation] = None, put: _root_.scala.Option[io.apibuilder.swagger.v0.models.Operation] = None, post: _root_.scala.Option[io.apibuilder.swagger.v0.models.Operation] = None, delete: _root_.scala.Option[io.apibuilder.swagger.v0.models.Operation] = None, options: _root_.scala.Option[io.apibuilder.swagger.v0.models.Operation] = None, head: _root_.scala.Option[io.apibuilder.swagger.v0.models.Operation] = None, patch: _root_.scala.Option[io.apibuilder.swagger.v0.models.Operation] = None, parameters: _root_.scala.Option[Seq[io.apibuilder.swagger.v0.models.ParameterOrRef]] = None ) /** * @param ref TODO: Needs to be named '$ref' */ final case class Reference( ref: String ) extends ParameterOrRef with ResponseOrRef final case class Response( description: String, schema: _root_.scala.Option[io.apibuilder.swagger.v0.models.Schema] = None, headers: _root_.scala.Option[Map[String, io.apibuilder.swagger.v0.models.Header]] = None, examples: _root_.scala.Option[Map[String, _root_.io.circe.Json]] = None ) extends ResponseOrRef /** * @param ref TODO: Needs to be named '$ref' * @param items TODO: figure out if this also needs to support boolean * (http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.9). * It's possible that a uni-directional approach may allow us to avoid supporting * this odd type. * @param additionalProperties TODO: figure out if this also needs to support boolean * (http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.18). * It's possible that a uni-directional approach may allow us to avoid supporting * this odd type. */ final case class Schema( ref: _root_.scala.Option[String] = None, format: _root_.scala.Option[io.apibuilder.swagger.v0.models.FormatType] = None, title: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, default: _root_.scala.Option[Map[String, _root_.io.circe.Json]] = None, multipleOf: _root_.scala.Option[Long] = None, maximum: _root_.scala.Option[Long] = None, exclusiveMaximum: _root_.scala.Option[Boolean] = None, minimum: _root_.scala.Option[Long] = None, exclusiveMinimum: _root_.scala.Option[Boolean] = None, maxLength: _root_.scala.Option[Int] = None, minLength: _root_.scala.Option[Int] = None, pattern: _root_.scala.Option[String] = None, maxItems: _root_.scala.Option[Int] = None, minItems: _root_.scala.Option[Int] = None, uniqueItems: _root_.scala.Option[Boolean] = None, maxProperties: _root_.scala.Option[Int] = None, minProperties: _root_.scala.Option[Int] = None, required: _root_.scala.Option[Seq[String]] = None, `enum`: _root_.scala.Option[Seq[Map[String, _root_.io.circe.Json]]] = None, `type`: _root_.scala.Option[Seq[String]] = None, items: _root_.scala.Option[io.apibuilder.swagger.v0.models.Schema] = None, allOf: _root_.scala.Option[Seq[io.apibuilder.swagger.v0.models.Schema]] = None, properties: _root_.scala.Option[Map[String, io.apibuilder.swagger.v0.models.Schema]] = None, additionalProperties: _root_.scala.Option[io.apibuilder.swagger.v0.models.Schema] = None, discriminator: _root_.scala.Option[String] = None, readOnly: _root_.scala.Option[Boolean] = None, xml: _root_.scala.Option[io.apibuilder.swagger.v0.models.Xml] = None, externalDocs: _root_.scala.Option[io.apibuilder.swagger.v0.models.ExternalDocumentation] = None, example: _root_.scala.Option[Map[String, _root_.io.circe.Json]] = None ) /** * TODO: Consider making this a union type of the three different schemes (and * their required fields) * * @param name Required for apiKey * @param in Required for apiKey * @param flow Required for oauth2 * @param authorizationUrl Required for oauth2 * @param tokenUrl Required for oauth2 * @param scopes Required for oauth2 */ final case class SecurityScheme( `type`: io.apibuilder.swagger.v0.models.SecuritySchemeType, description: _root_.scala.Option[String] = None, name: _root_.scala.Option[String] = None, in: _root_.scala.Option[io.apibuilder.swagger.v0.models.ApiKeyInType] = None, flow: _root_.scala.Option[String] = None, authorizationUrl: _root_.scala.Option[String] = None, tokenUrl: _root_.scala.Option[String] = None, scopes: _root_.scala.Option[Map[String, String]] = None ) final case class Swagger( swagger: String, info: io.apibuilder.swagger.v0.models.Info, host: _root_.scala.Option[String] = None, basePath: _root_.scala.Option[String] = None, schemes: _root_.scala.Option[Seq[String]] = None, consumes: _root_.scala.Option[Seq[String]] = None, produces: _root_.scala.Option[Seq[String]] = None, paths: Map[String, io.apibuilder.swagger.v0.models.PathItem], definitions: _root_.scala.Option[Map[String, io.apibuilder.swagger.v0.models.Schema]] = None, parameters: _root_.scala.Option[Map[String, io.apibuilder.swagger.v0.models.Parameter]] = None, responses: _root_.scala.Option[Map[String, io.apibuilder.swagger.v0.models.Response]] = None, securityDefinitions: _root_.scala.Option[Map[String, io.apibuilder.swagger.v0.models.SecurityScheme]] = None, security: _root_.scala.Option[Map[String, String]] = None, tags: _root_.scala.Option[Seq[io.apibuilder.swagger.v0.models.Tag]] = None, externalDocs: _root_.scala.Option[io.apibuilder.swagger.v0.models.ExternalDocumentation] = None ) final case class Tag( name: String, description: _root_.scala.Option[String] = None, externalDocs: _root_.scala.Option[io.apibuilder.swagger.v0.models.ExternalDocumentation] = None ) final case class Xml( name: _root_.scala.Option[String] = None, namespace: _root_.scala.Option[String] = None, prefix: _root_.scala.Option[String] = None, attribute: _root_.scala.Option[Boolean] = None, wrapped: _root_.scala.Option[Boolean] = None ) /** * Provides future compatibility in clients - in the future, when a type is added * to the union ParameterOrRef, it will need to be handled in the client code. This * implementation will deserialize these future types as an instance of this class. * * @param description Information about the type that we received that is undefined in this version of * the client. */ final case class ParameterOrRefUndefinedType( description: String ) extends ParameterOrRef /** * Provides future compatibility in clients - in the future, when a type is added * to the union ResponseOrRef, it will need to be handled in the client code. This * implementation will deserialize these future types as an instance of this class. * * @param description Information about the type that we received that is undefined in this version of * the client. */ final case class ResponseOrRefUndefinedType( description: String ) extends ResponseOrRef sealed trait ApiKeyInType extends _root_.scala.Product with _root_.scala.Serializable object ApiKeyInType { case object Query extends ApiKeyInType { override def toString = "query" } case object Header extends ApiKeyInType { override def toString = "header" } /** * UNDEFINED captures values that are sent either in error or * that were added by the server after this library was * generated. We want to make it easy and obvious to users of * this library to handle this case gracefully. * * We use all CAPS for the variable name to avoid collisions * with the camel cased values above. */ final case class UNDEFINED(override val toString: String) extends ApiKeyInType /** * all returns a list of all the valid, known values. We use * lower case to avoid collisions with the camel cased values * above. */ val all: scala.List[ApiKeyInType] = scala.List(Query, Header) private val byName: Map[String, ApiKeyInType] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): ApiKeyInType = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[ApiKeyInType] = byName.get(value.toLowerCase) } sealed trait CollectionFormatType extends _root_.scala.Product with _root_.scala.Serializable object CollectionFormatType { case object Csv extends CollectionFormatType { override def toString = "csv" } case object Ssv extends CollectionFormatType { override def toString = "ssv" } case object Tsv extends CollectionFormatType { override def toString = "tsv" } case object Pipes extends CollectionFormatType { override def toString = "pipes" } /** * UNDEFINED captures values that are sent either in error or * that were added by the server after this library was * generated. We want to make it easy and obvious to users of * this library to handle this case gracefully. * * We use all CAPS for the variable name to avoid collisions * with the camel cased values above. */ final case class UNDEFINED(override val toString: String) extends CollectionFormatType /** * all returns a list of all the valid, known values. We use * lower case to avoid collisions with the camel cased values * above. */ val all: scala.List[CollectionFormatType] = scala.List(Csv, Ssv, Tsv, Pipes) private val byName: Map[String, CollectionFormatType] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): CollectionFormatType = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[CollectionFormatType] = byName.get(value.toLowerCase) } sealed trait FormatType extends _root_.scala.Product with _root_.scala.Serializable object FormatType { case object Binary extends FormatType { override def toString = "binary" } case object Byte extends FormatType { override def toString = "byte" } case object Date extends FormatType { override def toString = "date" } case object DateTime extends FormatType { override def toString = "date-time" } case object Double extends FormatType { override def toString = "double" } case object Float extends FormatType { override def toString = "float" } case object Int32 extends FormatType { override def toString = "int32" } case object Int64 extends FormatType { override def toString = "int64" } case object Password extends FormatType { override def toString = "password" } /** * UNDEFINED captures values that are sent either in error or * that were added by the server after this library was * generated. We want to make it easy and obvious to users of * this library to handle this case gracefully. * * We use all CAPS for the variable name to avoid collisions * with the camel cased values above. */ final case class UNDEFINED(override val toString: String) extends FormatType /** * all returns a list of all the valid, known values. We use * lower case to avoid collisions with the camel cased values * above. */ val all: scala.List[FormatType] = scala.List(Binary, Byte, Date, DateTime, Double, Float, Int32, Int64, Password) private val byName: Map[String, FormatType] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): FormatType = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[FormatType] = byName.get(value.toLowerCase) } sealed trait ItemsType extends _root_.scala.Product with _root_.scala.Serializable object ItemsType { case object String extends ItemsType { override def toString = "string" } case object Number extends ItemsType { override def toString = "number" } case object Integer extends ItemsType { override def toString = "integer" } case object Boolean extends ItemsType { override def toString = "boolean" } case object Array extends ItemsType { override def toString = "array" } /** * UNDEFINED captures values that are sent either in error or * that were added by the server after this library was * generated. We want to make it easy and obvious to users of * this library to handle this case gracefully. * * We use all CAPS for the variable name to avoid collisions * with the camel cased values above. */ final case class UNDEFINED(override val toString: String) extends ItemsType /** * all returns a list of all the valid, known values. We use * lower case to avoid collisions with the camel cased values * above. */ val all: scala.List[ItemsType] = scala.List(String, Number, Integer, Boolean, Array) private val byName: Map[String, ItemsType] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): ItemsType = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[ItemsType] = byName.get(value.toLowerCase) } sealed trait ParameterInType extends _root_.scala.Product with _root_.scala.Serializable object ParameterInType { case object Query extends ParameterInType { override def toString = "query" } case object Header extends ParameterInType { override def toString = "header" } case object Path extends ParameterInType { override def toString = "path" } case object FormData extends ParameterInType { override def toString = "formData" } case object Body extends ParameterInType { override def toString = "body" } /** * UNDEFINED captures values that are sent either in error or * that were added by the server after this library was * generated. We want to make it easy and obvious to users of * this library to handle this case gracefully. * * We use all CAPS for the variable name to avoid collisions * with the camel cased values above. */ final case class UNDEFINED(override val toString: String) extends ParameterInType /** * all returns a list of all the valid, known values. We use * lower case to avoid collisions with the camel cased values * above. */ val all: scala.List[ParameterInType] = scala.List(Query, Header, Path, FormData, Body) private val byName: Map[String, ParameterInType] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): ParameterInType = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[ParameterInType] = byName.get(value.toLowerCase) } sealed trait SecuritySchemeType extends _root_.scala.Product with _root_.scala.Serializable object SecuritySchemeType { case object Basic extends SecuritySchemeType { override def toString = "basic" } case object ApiKey extends SecuritySchemeType { override def toString = "apiKey" } case object Oauth2 extends SecuritySchemeType { override def toString = "oauth2" } /** * UNDEFINED captures values that are sent either in error or * that were added by the server after this library was * generated. We want to make it easy and obvious to users of * this library to handle this case gracefully. * * We use all CAPS for the variable name to avoid collisions * with the camel cased values above. */ final case class UNDEFINED(override val toString: String) extends SecuritySchemeType /** * all returns a list of all the valid, known values. We use * lower case to avoid collisions with the camel cased values * above. */ val all: scala.List[SecuritySchemeType] = scala.List(Basic, ApiKey, Oauth2) private val byName: Map[String, SecuritySchemeType] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): SecuritySchemeType = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[SecuritySchemeType] = byName.get(value.toLowerCase) } } package io.apibuilder.swagger.v0.models { package object json { import io.circe.Decoder._ import io.circe.Encoder._ import scala.language.implicitConversions // See below - Make Scala 2.11 Either monadic import scala.util.Try import io.circe.{Json, JsonObject, Encoder, Decoder, DecodingFailure} import io.circe.syntax._ import io.apibuilder.swagger.v0.models.json._ // Make Scala 2.11 Either monadic private[v0] implicit def eitherOps[A,B](e: Either[A,B]) = cats.implicits.catsSyntaxEither(e) private[v0] implicit val decodeUUID: Decoder[_root_.java.util.UUID] = Decoder.decodeString.emapTry(str => Try(_root_.java.util.UUID.fromString(str))) private[v0] implicit val encodeUUID: Encoder[_root_.java.util.UUID] = Encoder.encodeString.contramap[_root_.java.util.UUID](uuid => uuid.toString) private[v0] implicit val decodeInstant: Decoder[_root_.java.time.Instant] = Decoder.decodeString.emapTry(str => Try(_root_.java.time.OffsetDateTime.parse(str).toInstant)) private[v0] implicit val encodeInstant: Encoder[_root_.java.time.Instant] = Encoder.encodeString.contramap[_root_.java.time.Instant](_.toString) private[v0] implicit val decodeLocalDate: Decoder[_root_.java.time.LocalDate] = Decoder.decodeString.emapTry(str => Try(_root_.java.time.LocalDate.parse(str))) private[v0] implicit val encodeLocalDate: Encoder[_root_.java.time.LocalDate] = Encoder.encodeString.contramap[_root_.java.time.LocalDate](_.toString) implicit val jsonDecoderApibuilderSwaggerApiKeyInType: Decoder[io.apibuilder.swagger.v0.models.ApiKeyInType] = Decoder.decodeString.map(io.apibuilder.swagger.v0.models.ApiKeyInType(_)) implicit val jsonEncoderApibuilderSwaggerApiKeyInType: Encoder[io.apibuilder.swagger.v0.models.ApiKeyInType] = Encoder.encodeString.contramap[io.apibuilder.swagger.v0.models.ApiKeyInType](_.toString) implicit val jsonDecoderApibuilderSwaggerCollectionFormatType: Decoder[io.apibuilder.swagger.v0.models.CollectionFormatType] = Decoder.decodeString.map(io.apibuilder.swagger.v0.models.CollectionFormatType(_)) implicit val jsonEncoderApibuilderSwaggerCollectionFormatType: Encoder[io.apibuilder.swagger.v0.models.CollectionFormatType] = Encoder.encodeString.contramap[io.apibuilder.swagger.v0.models.CollectionFormatType](_.toString) implicit val jsonDecoderApibuilderSwaggerFormatType: Decoder[io.apibuilder.swagger.v0.models.FormatType] = Decoder.decodeString.map(io.apibuilder.swagger.v0.models.FormatType(_)) implicit val jsonEncoderApibuilderSwaggerFormatType: Encoder[io.apibuilder.swagger.v0.models.FormatType] = Encoder.encodeString.contramap[io.apibuilder.swagger.v0.models.FormatType](_.toString) implicit val jsonDecoderApibuilderSwaggerItemsType: Decoder[io.apibuilder.swagger.v0.models.ItemsType] = Decoder.decodeString.map(io.apibuilder.swagger.v0.models.ItemsType(_)) implicit val jsonEncoderApibuilderSwaggerItemsType: Encoder[io.apibuilder.swagger.v0.models.ItemsType] = Encoder.encodeString.contramap[io.apibuilder.swagger.v0.models.ItemsType](_.toString) implicit val jsonDecoderApibuilderSwaggerParameterInType: Decoder[io.apibuilder.swagger.v0.models.ParameterInType] = Decoder.decodeString.map(io.apibuilder.swagger.v0.models.ParameterInType(_)) implicit val jsonEncoderApibuilderSwaggerParameterInType: Encoder[io.apibuilder.swagger.v0.models.ParameterInType] = Encoder.encodeString.contramap[io.apibuilder.swagger.v0.models.ParameterInType](_.toString) implicit val jsonDecoderApibuilderSwaggerSecuritySchemeType: Decoder[io.apibuilder.swagger.v0.models.SecuritySchemeType] = Decoder.decodeString.map(io.apibuilder.swagger.v0.models.SecuritySchemeType(_)) implicit val jsonEncoderApibuilderSwaggerSecuritySchemeType: Encoder[io.apibuilder.swagger.v0.models.SecuritySchemeType] = Encoder.encodeString.contramap[io.apibuilder.swagger.v0.models.SecuritySchemeType](_.toString) implicit def decodeApibuilderSwaggerContact: Decoder[Contact] = Decoder.instance { c => for { name <- c.downField("name").as[Option[String]] url <- c.downField("url").as[Option[String]] email <- c.downField("email").as[Option[String]] } yield { Contact( name = name, url = url, email = email ) } } implicit def encodeApibuilderSwaggerContact: Encoder[Contact] = Encoder.instance { t => Json.fromFields(Seq( t.name.map(t => "name" -> t.asJson), t.url.map(t => "url" -> t.asJson), t.email.map(t => "email" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerExternalDocumentation: Decoder[ExternalDocumentation] = Decoder.instance { c => for { description <- c.downField("description").as[Option[String]] url <- c.downField("url").as[String] } yield { ExternalDocumentation( description = description, url = url ) } } implicit def encodeApibuilderSwaggerExternalDocumentation: Encoder[ExternalDocumentation] = Encoder.instance { t => Json.fromFields(Seq( t.description.map(t => "description" -> t.asJson), Some("url" -> t.url.asJson) ).flatten) } implicit def decodeApibuilderSwaggerHeader: Decoder[Header] = Decoder.instance { c => for { description <- c.downField("description").as[Option[String]] __type__ <- c.downField("type").as[io.apibuilder.swagger.v0.models.ItemsType] format <- c.downField("format").as[Option[io.apibuilder.swagger.v0.models.FormatType]] items <- c.downField("items").as[Option[io.apibuilder.swagger.v0.models.Items]] collectionFormat <- c.downField("collectionFormat").as[Option[io.apibuilder.swagger.v0.models.CollectionFormatType]] default <- c.downField("default").as[Option[Map[String, _root_.io.circe.Json]]] maximum <- c.downField("maximum").as[Option[Long]] exclusiveMaximum <- c.downField("exclusiveMaximum").as[Option[Boolean]] minimum <- c.downField("minimum").as[Option[Long]] exclusiveMinimum <- c.downField("exclusiveMinimum").as[Option[Boolean]] maxLength <- c.downField("maxLength").as[Option[Int]] minLength <- c.downField("minLength").as[Option[Int]] pattern <- c.downField("pattern").as[Option[String]] maxItems <- c.downField("maxItems").as[Option[Int]] minItems <- c.downField("minItems").as[Option[Int]] uniqueItems <- c.downField("uniqueItems").as[Option[Boolean]] __enum__ <- c.downField("enum").as[Option[Seq[Map[String, _root_.io.circe.Json]]]] multipleOf <- c.downField("multipleOf").as[Option[Long]] } yield { Header( description = description, `type` = __type__, format = format, items = items, collectionFormat = collectionFormat, default = default, maximum = maximum, exclusiveMaximum = exclusiveMaximum, minimum = minimum, exclusiveMinimum = exclusiveMinimum, maxLength = maxLength, minLength = minLength, pattern = pattern, maxItems = maxItems, minItems = minItems, uniqueItems = uniqueItems, `enum` = __enum__, multipleOf = multipleOf ) } } implicit def encodeApibuilderSwaggerHeader: Encoder[Header] = Encoder.instance { t => Json.fromFields(Seq( t.description.map(t => "description" -> t.asJson), Some("type" -> t.`type`.asJson), t.format.map(t => "format" -> t.asJson), t.items.map(t => "items" -> t.asJson), t.collectionFormat.map(t => "collectionFormat" -> t.asJson), t.default.map(t => "default" -> t.asJson), t.maximum.map(t => "maximum" -> t.asJson), t.exclusiveMaximum.map(t => "exclusiveMaximum" -> t.asJson), t.minimum.map(t => "minimum" -> t.asJson), t.exclusiveMinimum.map(t => "exclusiveMinimum" -> t.asJson), t.maxLength.map(t => "maxLength" -> t.asJson), t.minLength.map(t => "minLength" -> t.asJson), t.pattern.map(t => "pattern" -> t.asJson), t.maxItems.map(t => "maxItems" -> t.asJson), t.minItems.map(t => "minItems" -> t.asJson), t.uniqueItems.map(t => "uniqueItems" -> t.asJson), t.`enum`.map(t => "enum" -> t.asJson), t.multipleOf.map(t => "multipleOf" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerInfo: Decoder[Info] = Decoder.instance { c => for { title <- c.downField("title").as[String] description <- c.downField("description").as[Option[String]] termsOfService <- c.downField("termsOfService").as[Option[String]] contact <- c.downField("contact").as[Option[io.apibuilder.swagger.v0.models.Contact]] license <- c.downField("license").as[Option[io.apibuilder.swagger.v0.models.License]] version <- c.downField("version").as[String] } yield { Info( title = title, description = description, termsOfService = termsOfService, contact = contact, license = license, version = version ) } } implicit def encodeApibuilderSwaggerInfo: Encoder[Info] = Encoder.instance { t => Json.fromFields(Seq( Some("title" -> t.title.asJson), t.description.map(t => "description" -> t.asJson), t.termsOfService.map(t => "termsOfService" -> t.asJson), t.contact.map(t => "contact" -> t.asJson), t.license.map(t => "license" -> t.asJson), Some("version" -> t.version.asJson) ).flatten) } implicit def decodeApibuilderSwaggerItems: Decoder[Items] = Decoder.instance { c => for { __type__ <- c.downField("type").as[io.apibuilder.swagger.v0.models.ItemsType] format <- c.downField("format").as[Option[io.apibuilder.swagger.v0.models.FormatType]] items <- c.downField("items").as[Option[io.apibuilder.swagger.v0.models.Items]] collectionFormat <- c.downField("collectionFormat").as[Option[io.apibuilder.swagger.v0.models.CollectionFormatType]] default <- c.downField("default").as[Option[Map[String, _root_.io.circe.Json]]] maximum <- c.downField("maximum").as[Option[Long]] exclusiveMaximum <- c.downField("exclusiveMaximum").as[Option[Boolean]] minimum <- c.downField("minimum").as[Option[Long]] exclusiveMinimum <- c.downField("exclusiveMinimum").as[Option[Boolean]] maxLength <- c.downField("maxLength").as[Option[Int]] minLength <- c.downField("minLength").as[Option[Int]] pattern <- c.downField("pattern").as[Option[String]] maxItems <- c.downField("maxItems").as[Option[Int]] minItems <- c.downField("minItems").as[Option[Int]] uniqueItems <- c.downField("uniqueItems").as[Option[Boolean]] __enum__ <- c.downField("enum").as[Option[Seq[Map[String, _root_.io.circe.Json]]]] multipleOf <- c.downField("multipleOf").as[Option[Long]] } yield { Items( `type` = __type__, format = format, items = items, collectionFormat = collectionFormat, default = default, maximum = maximum, exclusiveMaximum = exclusiveMaximum, minimum = minimum, exclusiveMinimum = exclusiveMinimum, maxLength = maxLength, minLength = minLength, pattern = pattern, maxItems = maxItems, minItems = minItems, uniqueItems = uniqueItems, `enum` = __enum__, multipleOf = multipleOf ) } } implicit def encodeApibuilderSwaggerItems: Encoder[Items] = Encoder.instance { t => Json.fromFields(Seq( Some("type" -> t.`type`.asJson), t.format.map(t => "format" -> t.asJson), t.items.map(t => "items" -> t.asJson), t.collectionFormat.map(t => "collectionFormat" -> t.asJson), t.default.map(t => "default" -> t.asJson), t.maximum.map(t => "maximum" -> t.asJson), t.exclusiveMaximum.map(t => "exclusiveMaximum" -> t.asJson), t.minimum.map(t => "minimum" -> t.asJson), t.exclusiveMinimum.map(t => "exclusiveMinimum" -> t.asJson), t.maxLength.map(t => "maxLength" -> t.asJson), t.minLength.map(t => "minLength" -> t.asJson), t.pattern.map(t => "pattern" -> t.asJson), t.maxItems.map(t => "maxItems" -> t.asJson), t.minItems.map(t => "minItems" -> t.asJson), t.uniqueItems.map(t => "uniqueItems" -> t.asJson), t.`enum`.map(t => "enum" -> t.asJson), t.multipleOf.map(t => "multipleOf" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerLicense: Decoder[License] = Decoder.instance { c => for { name <- c.downField("name").as[String] url <- c.downField("url").as[Option[String]] } yield { License( name = name, url = url ) } } implicit def encodeApibuilderSwaggerLicense: Encoder[License] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), t.url.map(t => "url" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerOperation: Decoder[Operation] = Decoder.instance { c => for { tags <- c.downField("tags").as[Option[Seq[String]]] summary <- c.downField("summary").as[Option[String]] description <- c.downField("description").as[Option[String]] externalDocs <- c.downField("externalDocs").as[Option[io.apibuilder.swagger.v0.models.ExternalDocumentation]] operationId <- c.downField("operationId").as[Option[String]] consumes <- c.downField("consumes").as[Option[Seq[String]]] produces <- c.downField("produces").as[Option[Seq[String]]] parameters <- c.downField("parameters").as[Option[Seq[io.apibuilder.swagger.v0.models.ParameterOrRef]]] responses <- c.downField("responses").as[Map[String, io.apibuilder.swagger.v0.models.ResponseOrRef]] schemes <- c.downField("schemes").as[Option[Seq[String]]] deprecated <- c.downField("deprecated").as[Option[Boolean]] security <- c.downField("security").as[Option[Seq[Map[String, Seq[String]]]]] } yield { Operation( tags = tags, summary = summary, description = description, externalDocs = externalDocs, operationId = operationId, consumes = consumes, produces = produces, parameters = parameters, responses = responses, schemes = schemes, deprecated = deprecated, security = security ) } } implicit def encodeApibuilderSwaggerOperation: Encoder[Operation] = Encoder.instance { t => Json.fromFields(Seq( t.tags.map(t => "tags" -> t.asJson), t.summary.map(t => "summary" -> t.asJson), t.description.map(t => "description" -> t.asJson), t.externalDocs.map(t => "externalDocs" -> t.asJson), t.operationId.map(t => "operationId" -> t.asJson), t.consumes.map(t => "consumes" -> t.asJson), t.produces.map(t => "produces" -> t.asJson), t.parameters.map(t => "parameters" -> t.asJson), Some("responses" -> t.responses.asJson), t.schemes.map(t => "schemes" -> t.asJson), t.deprecated.map(t => "deprecated" -> t.asJson), t.security.map(t => "security" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerParameter: Decoder[Parameter] = Decoder.instance { c => for { name <- c.downField("name").as[String] in <- c.downField("in").as[io.apibuilder.swagger.v0.models.ParameterInType] description <- c.downField("description").as[Option[String]] required <- c.downField("required").as[Boolean] schema <- c.downField("schema").as[Option[io.apibuilder.swagger.v0.models.Schema]] __type__ <- c.downField("type").as[Option[String]] format <- c.downField("format").as[Option[String]] allowEmptyValue <- c.downField("allowEmptyValue").as[Option[Boolean]] items <- c.downField("items").as[Option[io.apibuilder.swagger.v0.models.Items]] collectionFormat <- c.downField("collectionFormat").as[Option[io.apibuilder.swagger.v0.models.CollectionFormatType]] default <- c.downField("default").as[Option[Map[String, _root_.io.circe.Json]]] maximum <- c.downField("maximum").as[Option[Long]] exclusiveMaximum <- c.downField("exclusiveMaximum").as[Option[Boolean]] minimum <- c.downField("minimum").as[Option[Long]] exclusiveMinimum <- c.downField("exclusiveMinimum").as[Option[Boolean]] maxLength <- c.downField("maxLength").as[Option[Int]] minLength <- c.downField("minLength").as[Option[Int]] pattern <- c.downField("pattern").as[Option[String]] maxItems <- c.downField("maxItems").as[Option[Int]] minItems <- c.downField("minItems").as[Option[Int]] uniqueItems <- c.downField("uniqueItems").as[Option[Boolean]] __enum__ <- c.downField("enum").as[Option[Seq[Map[String, _root_.io.circe.Json]]]] multipleOf <- c.downField("multipleOf").as[Option[Long]] } yield { Parameter( name = name, in = in, description = description, required = required, schema = schema, `type` = __type__, format = format, allowEmptyValue = allowEmptyValue, items = items, collectionFormat = collectionFormat, default = default, maximum = maximum, exclusiveMaximum = exclusiveMaximum, minimum = minimum, exclusiveMinimum = exclusiveMinimum, maxLength = maxLength, minLength = minLength, pattern = pattern, maxItems = maxItems, minItems = minItems, uniqueItems = uniqueItems, `enum` = __enum__, multipleOf = multipleOf ) } } implicit def encodeApibuilderSwaggerParameter: Encoder[Parameter] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), Some("in" -> t.in.asJson), t.description.map(t => "description" -> t.asJson), Some("required" -> t.required.asJson), t.schema.map(t => "schema" -> t.asJson), t.`type`.map(t => "type" -> t.asJson), t.format.map(t => "format" -> t.asJson), t.allowEmptyValue.map(t => "allowEmptyValue" -> t.asJson), t.items.map(t => "items" -> t.asJson), t.collectionFormat.map(t => "collectionFormat" -> t.asJson), t.default.map(t => "default" -> t.asJson), t.maximum.map(t => "maximum" -> t.asJson), t.exclusiveMaximum.map(t => "exclusiveMaximum" -> t.asJson), t.minimum.map(t => "minimum" -> t.asJson), t.exclusiveMinimum.map(t => "exclusiveMinimum" -> t.asJson), t.maxLength.map(t => "maxLength" -> t.asJson), t.minLength.map(t => "minLength" -> t.asJson), t.pattern.map(t => "pattern" -> t.asJson), t.maxItems.map(t => "maxItems" -> t.asJson), t.minItems.map(t => "minItems" -> t.asJson), t.uniqueItems.map(t => "uniqueItems" -> t.asJson), t.`enum`.map(t => "enum" -> t.asJson), t.multipleOf.map(t => "multipleOf" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerPathItem: Decoder[PathItem] = Decoder.instance { c => for { ref <- c.downField("ref").as[Option[String]] get <- c.downField("get").as[Option[io.apibuilder.swagger.v0.models.Operation]] put <- c.downField("put").as[Option[io.apibuilder.swagger.v0.models.Operation]] post <- c.downField("post").as[Option[io.apibuilder.swagger.v0.models.Operation]] delete <- c.downField("delete").as[Option[io.apibuilder.swagger.v0.models.Operation]] options <- c.downField("options").as[Option[io.apibuilder.swagger.v0.models.Operation]] head <- c.downField("head").as[Option[io.apibuilder.swagger.v0.models.Operation]] patch <- c.downField("patch").as[Option[io.apibuilder.swagger.v0.models.Operation]] parameters <- c.downField("parameters").as[Option[Seq[io.apibuilder.swagger.v0.models.ParameterOrRef]]] } yield { PathItem( ref = ref, get = get, put = put, post = post, delete = delete, options = options, head = head, patch = patch, parameters = parameters ) } } implicit def encodeApibuilderSwaggerPathItem: Encoder[PathItem] = Encoder.instance { t => Json.fromFields(Seq( t.ref.map(t => "ref" -> t.asJson), t.get.map(t => "get" -> t.asJson), t.put.map(t => "put" -> t.asJson), t.post.map(t => "post" -> t.asJson), t.delete.map(t => "delete" -> t.asJson), t.options.map(t => "options" -> t.asJson), t.head.map(t => "head" -> t.asJson), t.patch.map(t => "patch" -> t.asJson), t.parameters.map(t => "parameters" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerReference: Decoder[Reference] = Decoder.instance { c => for { ref <- c.downField("ref").as[String] } yield { Reference( ref = ref ) } } implicit def encodeApibuilderSwaggerReference: Encoder[Reference] = Encoder.instance { t => Json.fromFields(Seq( Some("ref" -> t.ref.asJson) ).flatten) } implicit def decodeApibuilderSwaggerResponse: Decoder[Response] = Decoder.instance { c => for { description <- c.downField("description").as[String] schema <- c.downField("schema").as[Option[io.apibuilder.swagger.v0.models.Schema]] headers <- c.downField("headers").as[Option[Map[String, io.apibuilder.swagger.v0.models.Header]]] examples <- c.downField("examples").as[Option[Map[String, _root_.io.circe.Json]]] } yield { Response( description = description, schema = schema, headers = headers, examples = examples ) } } implicit def encodeApibuilderSwaggerResponse: Encoder[Response] = Encoder.instance { t => Json.fromFields(Seq( Some("description" -> t.description.asJson), t.schema.map(t => "schema" -> t.asJson), t.headers.map(t => "headers" -> t.asJson), t.examples.map(t => "examples" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerSchema: Decoder[Schema] = Decoder.instance { c => for { ref <- c.downField("ref").as[Option[String]] format <- c.downField("format").as[Option[io.apibuilder.swagger.v0.models.FormatType]] title <- c.downField("title").as[Option[String]] description <- c.downField("description").as[Option[String]] default <- c.downField("default").as[Option[Map[String, _root_.io.circe.Json]]] multipleOf <- c.downField("multipleOf").as[Option[Long]] maximum <- c.downField("maximum").as[Option[Long]] exclusiveMaximum <- c.downField("exclusiveMaximum").as[Option[Boolean]] minimum <- c.downField("minimum").as[Option[Long]] exclusiveMinimum <- c.downField("exclusiveMinimum").as[Option[Boolean]] maxLength <- c.downField("maxLength").as[Option[Int]] minLength <- c.downField("minLength").as[Option[Int]] pattern <- c.downField("pattern").as[Option[String]] maxItems <- c.downField("maxItems").as[Option[Int]] minItems <- c.downField("minItems").as[Option[Int]] uniqueItems <- c.downField("uniqueItems").as[Option[Boolean]] maxProperties <- c.downField("maxProperties").as[Option[Int]] minProperties <- c.downField("minProperties").as[Option[Int]] required <- c.downField("required").as[Option[Seq[String]]] __enum__ <- c.downField("enum").as[Option[Seq[Map[String, _root_.io.circe.Json]]]] __type__ <- c.downField("type").as[Option[Seq[String]]] items <- c.downField("items").as[Option[io.apibuilder.swagger.v0.models.Schema]] allOf <- c.downField("allOf").as[Option[Seq[io.apibuilder.swagger.v0.models.Schema]]] properties <- c.downField("properties").as[Option[Map[String, io.apibuilder.swagger.v0.models.Schema]]] additionalProperties <- c.downField("additionalProperties").as[Option[io.apibuilder.swagger.v0.models.Schema]] discriminator <- c.downField("discriminator").as[Option[String]] readOnly <- c.downField("readOnly").as[Option[Boolean]] xml <- c.downField("xml").as[Option[io.apibuilder.swagger.v0.models.Xml]] externalDocs <- c.downField("externalDocs").as[Option[io.apibuilder.swagger.v0.models.ExternalDocumentation]] example <- c.downField("example").as[Option[Map[String, _root_.io.circe.Json]]] } yield { Schema( ref = ref, format = format, title = title, description = description, default = default, multipleOf = multipleOf, maximum = maximum, exclusiveMaximum = exclusiveMaximum, minimum = minimum, exclusiveMinimum = exclusiveMinimum, maxLength = maxLength, minLength = minLength, pattern = pattern, maxItems = maxItems, minItems = minItems, uniqueItems = uniqueItems, maxProperties = maxProperties, minProperties = minProperties, required = required, `enum` = __enum__, `type` = __type__, items = items, allOf = allOf, properties = properties, additionalProperties = additionalProperties, discriminator = discriminator, readOnly = readOnly, xml = xml, externalDocs = externalDocs, example = example ) } } implicit def encodeApibuilderSwaggerSchema: Encoder[Schema] = Encoder.instance { t => Json.fromFields(Seq( t.ref.map(t => "ref" -> t.asJson), t.format.map(t => "format" -> t.asJson), t.title.map(t => "title" -> t.asJson), t.description.map(t => "description" -> t.asJson), t.default.map(t => "default" -> t.asJson), t.multipleOf.map(t => "multipleOf" -> t.asJson), t.maximum.map(t => "maximum" -> t.asJson), t.exclusiveMaximum.map(t => "exclusiveMaximum" -> t.asJson), t.minimum.map(t => "minimum" -> t.asJson), t.exclusiveMinimum.map(t => "exclusiveMinimum" -> t.asJson), t.maxLength.map(t => "maxLength" -> t.asJson), t.minLength.map(t => "minLength" -> t.asJson), t.pattern.map(t => "pattern" -> t.asJson), t.maxItems.map(t => "maxItems" -> t.asJson), t.minItems.map(t => "minItems" -> t.asJson), t.uniqueItems.map(t => "uniqueItems" -> t.asJson), t.maxProperties.map(t => "maxProperties" -> t.asJson), t.minProperties.map(t => "minProperties" -> t.asJson), t.required.map(t => "required" -> t.asJson), t.`enum`.map(t => "enum" -> t.asJson), t.`type`.map(t => "type" -> t.asJson), t.items.map(t => "items" -> t.asJson), t.allOf.map(t => "allOf" -> t.asJson), t.properties.map(t => "properties" -> t.asJson), t.additionalProperties.map(t => "additionalProperties" -> t.asJson), t.discriminator.map(t => "discriminator" -> t.asJson), t.readOnly.map(t => "readOnly" -> t.asJson), t.xml.map(t => "xml" -> t.asJson), t.externalDocs.map(t => "externalDocs" -> t.asJson), t.example.map(t => "example" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerSecurityScheme: Decoder[SecurityScheme] = Decoder.instance { c => for { __type__ <- c.downField("type").as[io.apibuilder.swagger.v0.models.SecuritySchemeType] description <- c.downField("description").as[Option[String]] name <- c.downField("name").as[Option[String]] in <- c.downField("in").as[Option[io.apibuilder.swagger.v0.models.ApiKeyInType]] flow <- c.downField("flow").as[Option[String]] authorizationUrl <- c.downField("authorizationUrl").as[Option[String]] tokenUrl <- c.downField("tokenUrl").as[Option[String]] scopes <- c.downField("scopes").as[Option[Map[String, String]]] } yield { SecurityScheme( `type` = __type__, description = description, name = name, in = in, flow = flow, authorizationUrl = authorizationUrl, tokenUrl = tokenUrl, scopes = scopes ) } } implicit def encodeApibuilderSwaggerSecurityScheme: Encoder[SecurityScheme] = Encoder.instance { t => Json.fromFields(Seq( Some("type" -> t.`type`.asJson), t.description.map(t => "description" -> t.asJson), t.name.map(t => "name" -> t.asJson), t.in.map(t => "in" -> t.asJson), t.flow.map(t => "flow" -> t.asJson), t.authorizationUrl.map(t => "authorizationUrl" -> t.asJson), t.tokenUrl.map(t => "tokenUrl" -> t.asJson), t.scopes.map(t => "scopes" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerSwagger: Decoder[Swagger] = Decoder.instance { c => for { swagger <- c.downField("swagger").as[String] info <- c.downField("info").as[io.apibuilder.swagger.v0.models.Info] host <- c.downField("host").as[Option[String]] basePath <- c.downField("basePath").as[Option[String]] schemes <- c.downField("schemes").as[Option[Seq[String]]] consumes <- c.downField("consumes").as[Option[Seq[String]]] produces <- c.downField("produces").as[Option[Seq[String]]] paths <- c.downField("paths").as[Map[String, io.apibuilder.swagger.v0.models.PathItem]] definitions <- c.downField("definitions").as[Option[Map[String, io.apibuilder.swagger.v0.models.Schema]]] parameters <- c.downField("parameters").as[Option[Map[String, io.apibuilder.swagger.v0.models.Parameter]]] responses <- c.downField("responses").as[Option[Map[String, io.apibuilder.swagger.v0.models.Response]]] securityDefinitions <- c.downField("securityDefinitions").as[Option[Map[String, io.apibuilder.swagger.v0.models.SecurityScheme]]] security <- c.downField("security").as[Option[Map[String, String]]] tags <- c.downField("tags").as[Option[Seq[io.apibuilder.swagger.v0.models.Tag]]] externalDocs <- c.downField("externalDocs").as[Option[io.apibuilder.swagger.v0.models.ExternalDocumentation]] } yield { Swagger( swagger = swagger, info = info, host = host, basePath = basePath, schemes = schemes, consumes = consumes, produces = produces, paths = paths, definitions = definitions, parameters = parameters, responses = responses, securityDefinitions = securityDefinitions, security = security, tags = tags, externalDocs = externalDocs ) } } implicit def encodeApibuilderSwaggerSwagger: Encoder[Swagger] = Encoder.instance { t => Json.fromFields(Seq( Some("swagger" -> t.swagger.asJson), Some("info" -> t.info.asJson), t.host.map(t => "host" -> t.asJson), t.basePath.map(t => "basePath" -> t.asJson), t.schemes.map(t => "schemes" -> t.asJson), t.consumes.map(t => "consumes" -> t.asJson), t.produces.map(t => "produces" -> t.asJson), Some("paths" -> t.paths.asJson), t.definitions.map(t => "definitions" -> t.asJson), t.parameters.map(t => "parameters" -> t.asJson), t.responses.map(t => "responses" -> t.asJson), t.securityDefinitions.map(t => "securityDefinitions" -> t.asJson), t.security.map(t => "security" -> t.asJson), t.tags.map(t => "tags" -> t.asJson), t.externalDocs.map(t => "externalDocs" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerTag: Decoder[Tag] = Decoder.instance { c => for { name <- c.downField("name").as[String] description <- c.downField("description").as[Option[String]] externalDocs <- c.downField("externalDocs").as[Option[io.apibuilder.swagger.v0.models.ExternalDocumentation]] } yield { Tag( name = name, description = description, externalDocs = externalDocs ) } } implicit def encodeApibuilderSwaggerTag: Encoder[Tag] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), t.description.map(t => "description" -> t.asJson), t.externalDocs.map(t => "externalDocs" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerXml: Decoder[Xml] = Decoder.instance { c => for { name <- c.downField("name").as[Option[String]] namespace <- c.downField("namespace").as[Option[String]] prefix <- c.downField("prefix").as[Option[String]] attribute <- c.downField("attribute").as[Option[Boolean]] wrapped <- c.downField("wrapped").as[Option[Boolean]] } yield { Xml( name = name, namespace = namespace, prefix = prefix, attribute = attribute, wrapped = wrapped ) } } implicit def encodeApibuilderSwaggerXml: Encoder[Xml] = Encoder.instance { t => Json.fromFields(Seq( t.name.map(t => "name" -> t.asJson), t.namespace.map(t => "namespace" -> t.asJson), t.prefix.map(t => "prefix" -> t.asJson), t.attribute.map(t => "attribute" -> t.asJson), t.wrapped.map(t => "wrapped" -> t.asJson) ).flatten) } implicit def decodeApibuilderSwaggerParameterOrRef: Decoder[ParameterOrRef] = Decoder.instance { c => c.get[io.apibuilder.swagger.v0.models.Parameter]("parameter") orElse c.get[io.apibuilder.swagger.v0.models.Reference]("reference") orElse Right(io.apibuilder.swagger.v0.models.ParameterOrRefUndefinedType(c.value.toString)) } implicit def encodeApibuilderSwaggerParameterOrRef: Encoder[ParameterOrRef] = Encoder.instance { case t: io.apibuilder.swagger.v0.models.Parameter => Json.fromJsonObject(JsonObject.singleton("parameter", t.asJson)) case t: io.apibuilder.swagger.v0.models.Reference => Json.fromJsonObject(JsonObject.singleton("reference", t.asJson)) case other => sys.error(s"The type[${other.getClass.getName}] has no JSON encoder") } implicit def decodeApibuilderSwaggerResponseOrRef: Decoder[ResponseOrRef] = Decoder.instance { c => c.get[io.apibuilder.swagger.v0.models.Response]("response") orElse c.get[io.apibuilder.swagger.v0.models.Reference]("reference") orElse Right(io.apibuilder.swagger.v0.models.ResponseOrRefUndefinedType(c.value.toString)) } implicit def encodeApibuilderSwaggerResponseOrRef: Encoder[ResponseOrRef] = Encoder.instance { case t: io.apibuilder.swagger.v0.models.Response => Json.fromJsonObject(JsonObject.singleton("response", t.asJson)) case t: io.apibuilder.swagger.v0.models.Reference => Json.fromJsonObject(JsonObject.singleton("reference", t.asJson)) case other => sys.error(s"The type[${other.getClass.getName}] has no JSON encoder") } } }