/** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.16.53 * User agent: apibuilder app.apibuilder.io/apicollective/apibuilder-api-json/0.16.53/http4s_0_23 */ package io.apibuilder.api.json.v0.models { final case class Annotation( description: _root_.scala.Option[String] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class ApiJson( name: String, info: _root_.scala.Option[io.apibuilder.api.json.v0.models.Info] = None, namespace: _root_.scala.Option[String] = None, baseUrl: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, imports: Seq[io.apibuilder.api.json.v0.models.Import] = Nil, headers: Seq[io.apibuilder.api.json.v0.models.Header] = Nil, enums: Map[String, io.apibuilder.api.json.v0.models.Enum] = Map.empty, interfaces: Map[String, io.apibuilder.api.json.v0.models.Interface] = Map.empty, templates: _root_.scala.Option[io.apibuilder.api.json.v0.models.Templates] = None, unions: Map[String, io.apibuilder.api.json.v0.models.Union] = Map.empty, models: Map[String, io.apibuilder.api.json.v0.models.Model] = Map.empty, resources: Map[String, io.apibuilder.api.json.v0.models.Resource] = Map.empty, annotations: Map[String, io.apibuilder.api.json.v0.models.Annotation] = Map.empty, attributes: Seq[io.apibuilder.api.json.v0.models.Attribute] = Nil ) final case class Attribute( name: String, value: Map[String, _root_.io.circe.Json] ) final case class Body( `type`: String, description: _root_.scala.Option[String] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) 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 Deprecation( description: _root_.scala.Option[String] = None ) final case class Enum( plural: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, values: Seq[io.apibuilder.api.json.v0.models.EnumValue], attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class EnumValue( name: String, value: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class Field( name: String, `type`: String, description: _root_.scala.Option[String] = None, required: Boolean = true, default: _root_.scala.Option[_root_.io.circe.Json] = None, example: _root_.scala.Option[String] = None, minimum: _root_.scala.Option[Long] = None, maximum: _root_.scala.Option[Long] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, annotations: _root_.scala.Option[Seq[String]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class Header( name: String, `type`: String, required: Boolean = true, description: _root_.scala.Option[String] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class Import( uri: String ) final case class Info( contact: _root_.scala.Option[io.apibuilder.api.json.v0.models.Contact] = None, license: _root_.scala.Option[io.apibuilder.api.json.v0.models.License] = None ) final case class Interface( plural: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, fields: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Field]] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) /** * Describes the software license contact for this service */ final case class License( name: String, url: _root_.scala.Option[String] = None ) final case class Model( description: _root_.scala.Option[String] = None, plural: _root_.scala.Option[String] = None, fields: Seq[io.apibuilder.api.json.v0.models.Field] = Nil, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, interfaces: _root_.scala.Option[Seq[String]] = None, templates: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.TemplateDeclaration]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class Operation( method: String, path: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, body: _root_.scala.Option[io.apibuilder.api.json.v0.models.Body] = None, parameters: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Parameter]] = None, responses: _root_.scala.Option[Map[String, io.apibuilder.api.json.v0.models.Response]] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class Parameter( name: String, `type`: String, location: io.apibuilder.api.json.v0.models.ParameterLocation = io.apibuilder.api.json.v0.models.ParameterLocation.Query, description: _root_.scala.Option[String] = None, required: Boolean = true, default: _root_.scala.Option[_root_.io.circe.Json] = None, minimum: _root_.scala.Option[Long] = None, maximum: _root_.scala.Option[Long] = None, example: _root_.scala.Option[String] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class Resource( path: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, operations: Seq[io.apibuilder.api.json.v0.models.Operation] = Nil, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, templates: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.TemplateDeclaration]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class Response( `type`: String, headers: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Header]] = None, description: _root_.scala.Option[String] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None ) /** * @param cast Casts the types declared in the template to the types you want to use in this * declaration */ final case class TemplateDeclaration( name: String, cast: _root_.scala.Option[Map[String, String]] = None ) /** * Experimental */ final case class Templates( models: _root_.scala.Option[Map[String, io.apibuilder.api.json.v0.models.Model]] = None, resources: _root_.scala.Option[Map[String, io.apibuilder.api.json.v0.models.Resource]] = None ) final case class Union( plural: _root_.scala.Option[String] = None, discriminator: _root_.scala.Option[String] = None, description: _root_.scala.Option[String] = None, types: Seq[io.apibuilder.api.json.v0.models.UnionType], attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, interfaces: _root_.scala.Option[Seq[String]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) final case class UnionType( `type`: String, description: _root_.scala.Option[String] = None, default: Boolean = false, discriminatorValue: _root_.scala.Option[String] = None, attributes: _root_.scala.Option[Seq[io.apibuilder.api.json.v0.models.Attribute]] = None, deprecation: _root_.scala.Option[io.apibuilder.api.json.v0.models.Deprecation] = None ) sealed trait ParameterLocation extends _root_.scala.Product with _root_.scala.Serializable object ParameterLocation { case object Path extends ParameterLocation { override def toString = "path" } case object Query extends ParameterLocation { override def toString = "query" } case object Form extends ParameterLocation { override def toString = "form" } case object Header extends ParameterLocation { 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 for 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 ParameterLocation /** * 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[ParameterLocation] = scala.List(Path, Query, Form, Header) private val byName: Map[String, ParameterLocation] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): ParameterLocation = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[ParameterLocation] = byName.get(value.toLowerCase) } } package io.apibuilder.api.json.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.api.json.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 jsonDecoderApibuilderApiJsonParameterLocation: Decoder[io.apibuilder.api.json.v0.models.ParameterLocation] = Decoder.decodeString.map(io.apibuilder.api.json.v0.models.ParameterLocation(_)) implicit val jsonEncoderApibuilderApiJsonParameterLocation: Encoder[io.apibuilder.api.json.v0.models.ParameterLocation] = Encoder.encodeString.contramap[io.apibuilder.api.json.v0.models.ParameterLocation](_.toString) implicit def decodeApibuilderApiJsonAnnotation: Decoder[Annotation] = Decoder.instance { c => for { description <- c.downField("description").as[Option[String]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Annotation( description = description, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonAnnotation: Encoder[Annotation] = Encoder.instance { t => Json.fromFields(Seq( t.description.map(t => "description" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonApiJson: Decoder[ApiJson] = Decoder.instance { c => for { name <- c.downField("name").as[String] info <- c.downField("info").as[Option[io.apibuilder.api.json.v0.models.Info]] namespace <- c.downField("namespace").as[Option[String]] baseUrl <- c.downField("base_url").as[Option[String]] description <- c.downField("description").as[Option[String]] imports <- c.downField("imports").as[Option[Seq[io.apibuilder.api.json.v0.models.Import]]] headers <- c.downField("headers").as[Option[Seq[io.apibuilder.api.json.v0.models.Header]]] enums <- c.downField("enums").as[Option[Map[String, io.apibuilder.api.json.v0.models.Enum]]] interfaces <- c.downField("interfaces").as[Option[Map[String, io.apibuilder.api.json.v0.models.Interface]]] templates <- c.downField("templates").as[Option[io.apibuilder.api.json.v0.models.Templates]] unions <- c.downField("unions").as[Option[Map[String, io.apibuilder.api.json.v0.models.Union]]] models <- c.downField("models").as[Option[Map[String, io.apibuilder.api.json.v0.models.Model]]] resources <- c.downField("resources").as[Option[Map[String, io.apibuilder.api.json.v0.models.Resource]]] annotations <- c.downField("annotations").as[Option[Map[String, io.apibuilder.api.json.v0.models.Annotation]]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] } yield { ApiJson( name = name, info = info, namespace = namespace, baseUrl = baseUrl, description = description, imports = imports.getOrElse(Nil), headers = headers.getOrElse(Nil), enums = enums.getOrElse(Map.empty), interfaces = interfaces.getOrElse(Map.empty), templates = templates, unions = unions.getOrElse(Map.empty), models = models.getOrElse(Map.empty), resources = resources.getOrElse(Map.empty), annotations = annotations.getOrElse(Map.empty), attributes = attributes.getOrElse(Nil) ) } } implicit def encodeApibuilderApiJsonApiJson: Encoder[ApiJson] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), t.info.map(t => "info" -> t.asJson), t.namespace.map(t => "namespace" -> t.asJson), t.baseUrl.map(t => "base_url" -> t.asJson), t.description.map(t => "description" -> t.asJson), Some("imports" -> t.imports.asJson), Some("headers" -> t.headers.asJson), Some("enums" -> t.enums.asJson), Some("interfaces" -> t.interfaces.asJson), t.templates.map(t => "templates" -> t.asJson), Some("unions" -> t.unions.asJson), Some("models" -> t.models.asJson), Some("resources" -> t.resources.asJson), Some("annotations" -> t.annotations.asJson), Some("attributes" -> t.attributes.asJson) ).flatten) } implicit def decodeApibuilderApiJsonAttribute: Decoder[Attribute] = Decoder.instance { c => for { name <- c.downField("name").as[String] value <- c.downField("value").as[Map[String, _root_.io.circe.Json]] } yield { Attribute( name = name, value = value ) } } implicit def encodeApibuilderApiJsonAttribute: Encoder[Attribute] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), Some("value" -> t.value.asJson) ).flatten) } implicit def decodeApibuilderApiJsonBody: Decoder[Body] = Decoder.instance { c => for { __type__ <- c.downField("type").as[String] description <- c.downField("description").as[Option[String]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Body( `type` = __type__, description = description, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonBody: Encoder[Body] = Encoder.instance { t => Json.fromFields(Seq( Some("type" -> t.`type`.asJson), t.description.map(t => "description" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonContact: 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 encodeApibuilderApiJsonContact: 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 decodeApibuilderApiJsonDeprecation: Decoder[Deprecation] = Decoder.instance { c => for { description <- c.downField("description").as[Option[String]] } yield { Deprecation( description = description ) } } implicit def encodeApibuilderApiJsonDeprecation: Encoder[Deprecation] = Encoder.instance { t => Json.fromFields(Seq( t.description.map(t => "description" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonEnum: Decoder[Enum] = Decoder.instance { c => for { plural <- c.downField("plural").as[Option[String]] description <- c.downField("description").as[Option[String]] values <- c.downField("values").as[Seq[io.apibuilder.api.json.v0.models.EnumValue]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Enum( plural = plural, description = description, values = values, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonEnum: Encoder[Enum] = Encoder.instance { t => Json.fromFields(Seq( t.plural.map(t => "plural" -> t.asJson), t.description.map(t => "description" -> t.asJson), Some("values" -> t.values.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonEnumValue: Decoder[EnumValue] = Decoder.instance { c => for { name <- c.downField("name").as[String] value <- c.downField("value").as[Option[String]] description <- c.downField("description").as[Option[String]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { EnumValue( name = name, value = value, description = description, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonEnumValue: Encoder[EnumValue] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), t.value.map(t => "value" -> t.asJson), t.description.map(t => "description" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonField: Decoder[Field] = Decoder.instance { c => for { name <- c.downField("name").as[String] __type__ <- c.downField("type").as[String] description <- c.downField("description").as[Option[String]] required <- c.downField("required").as[Option[Boolean]] default <- c.downField("default").as[Option[_root_.io.circe.Json]] example <- c.downField("example").as[Option[String]] minimum <- c.downField("minimum").as[Option[Long]] maximum <- c.downField("maximum").as[Option[Long]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] annotations <- c.downField("annotations").as[Option[Seq[String]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Field( name = name, `type` = __type__, description = description, required = required.getOrElse(true), default = default, example = example, minimum = minimum, maximum = maximum, attributes = attributes, annotations = annotations, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonField: Encoder[Field] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), Some("type" -> t.`type`.asJson), t.description.map(t => "description" -> t.asJson), Some("required" -> t.required.asJson), t.default.map(t => "default" -> t.asJson), t.example.map(t => "example" -> t.asJson), t.minimum.map(t => "minimum" -> t.asJson), t.maximum.map(t => "maximum" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.annotations.map(t => "annotations" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonHeader: Decoder[Header] = Decoder.instance { c => for { name <- c.downField("name").as[String] __type__ <- c.downField("type").as[String] required <- c.downField("required").as[Option[Boolean]] description <- c.downField("description").as[Option[String]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Header( name = name, `type` = __type__, required = required.getOrElse(true), description = description, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonHeader: Encoder[Header] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), Some("type" -> t.`type`.asJson), Some("required" -> t.required.asJson), t.description.map(t => "description" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonImport: Decoder[Import] = Decoder.instance { c => for { uri <- c.downField("uri").as[String] } yield { Import( uri = uri ) } } implicit def encodeApibuilderApiJsonImport: Encoder[Import] = Encoder.instance { t => Json.fromFields(Seq( Some("uri" -> t.uri.asJson) ).flatten) } implicit def decodeApibuilderApiJsonInfo: Decoder[Info] = Decoder.instance { c => for { contact <- c.downField("contact").as[Option[io.apibuilder.api.json.v0.models.Contact]] license <- c.downField("license").as[Option[io.apibuilder.api.json.v0.models.License]] } yield { Info( contact = contact, license = license ) } } implicit def encodeApibuilderApiJsonInfo: Encoder[Info] = Encoder.instance { t => Json.fromFields(Seq( t.contact.map(t => "contact" -> t.asJson), t.license.map(t => "license" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonInterface: Decoder[Interface] = Decoder.instance { c => for { plural <- c.downField("plural").as[Option[String]] description <- c.downField("description").as[Option[String]] fields <- c.downField("fields").as[Option[Seq[io.apibuilder.api.json.v0.models.Field]]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Interface( plural = plural, description = description, fields = fields, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonInterface: Encoder[Interface] = Encoder.instance { t => Json.fromFields(Seq( t.plural.map(t => "plural" -> t.asJson), t.description.map(t => "description" -> t.asJson), t.fields.map(t => "fields" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonLicense: 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 encodeApibuilderApiJsonLicense: Encoder[License] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), t.url.map(t => "url" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonModel: Decoder[Model] = Decoder.instance { c => for { description <- c.downField("description").as[Option[String]] plural <- c.downField("plural").as[Option[String]] fields <- c.downField("fields").as[Option[Seq[io.apibuilder.api.json.v0.models.Field]]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] interfaces <- c.downField("interfaces").as[Option[Seq[String]]] templates <- c.downField("templates").as[Option[Seq[io.apibuilder.api.json.v0.models.TemplateDeclaration]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Model( description = description, plural = plural, fields = fields.getOrElse(Nil), attributes = attributes, interfaces = interfaces, templates = templates, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonModel: Encoder[Model] = Encoder.instance { t => Json.fromFields(Seq( t.description.map(t => "description" -> t.asJson), t.plural.map(t => "plural" -> t.asJson), Some("fields" -> t.fields.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.interfaces.map(t => "interfaces" -> t.asJson), t.templates.map(t => "templates" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonOperation: Decoder[Operation] = Decoder.instance { c => for { method <- c.downField("method").as[String] path <- c.downField("path").as[Option[String]] description <- c.downField("description").as[Option[String]] body <- c.downField("body").as[Option[io.apibuilder.api.json.v0.models.Body]] parameters <- c.downField("parameters").as[Option[Seq[io.apibuilder.api.json.v0.models.Parameter]]] responses <- c.downField("responses").as[Option[Map[String, io.apibuilder.api.json.v0.models.Response]]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Operation( method = method, path = path, description = description, body = body, parameters = parameters, responses = responses, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonOperation: Encoder[Operation] = Encoder.instance { t => Json.fromFields(Seq( Some("method" -> t.method.asJson), t.path.map(t => "path" -> t.asJson), t.description.map(t => "description" -> t.asJson), t.body.map(t => "body" -> t.asJson), t.parameters.map(t => "parameters" -> t.asJson), t.responses.map(t => "responses" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonParameter: Decoder[Parameter] = Decoder.instance { c => for { name <- c.downField("name").as[String] __type__ <- c.downField("type").as[String] location <- c.downField("location").as[Option[io.apibuilder.api.json.v0.models.ParameterLocation]] description <- c.downField("description").as[Option[String]] required <- c.downField("required").as[Option[Boolean]] default <- c.downField("default").as[Option[_root_.io.circe.Json]] minimum <- c.downField("minimum").as[Option[Long]] maximum <- c.downField("maximum").as[Option[Long]] example <- c.downField("example").as[Option[String]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Parameter( name = name, `type` = __type__, location = location.getOrElse(io.apibuilder.api.json.v0.models.ParameterLocation.Query), description = description, required = required.getOrElse(true), default = default, minimum = minimum, maximum = maximum, example = example, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonParameter: Encoder[Parameter] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), Some("type" -> t.`type`.asJson), Some("location" -> t.location.asJson), t.description.map(t => "description" -> t.asJson), Some("required" -> t.required.asJson), t.default.map(t => "default" -> t.asJson), t.minimum.map(t => "minimum" -> t.asJson), t.maximum.map(t => "maximum" -> t.asJson), t.example.map(t => "example" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonResource: Decoder[Resource] = Decoder.instance { c => for { path <- c.downField("path").as[Option[String]] description <- c.downField("description").as[Option[String]] operations <- c.downField("operations").as[Option[Seq[io.apibuilder.api.json.v0.models.Operation]]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] templates <- c.downField("templates").as[Option[Seq[io.apibuilder.api.json.v0.models.TemplateDeclaration]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Resource( path = path, description = description, operations = operations.getOrElse(Nil), attributes = attributes, templates = templates, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonResource: Encoder[Resource] = Encoder.instance { t => Json.fromFields(Seq( t.path.map(t => "path" -> t.asJson), t.description.map(t => "description" -> t.asJson), Some("operations" -> t.operations.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.templates.map(t => "templates" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonResponse: Decoder[Response] = Decoder.instance { c => for { __type__ <- c.downField("type").as[String] headers <- c.downField("headers").as[Option[Seq[io.apibuilder.api.json.v0.models.Header]]] description <- c.downField("description").as[Option[String]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] } yield { Response( `type` = __type__, headers = headers, description = description, deprecation = deprecation, attributes = attributes ) } } implicit def encodeApibuilderApiJsonResponse: Encoder[Response] = Encoder.instance { t => Json.fromFields(Seq( Some("type" -> t.`type`.asJson), t.headers.map(t => "headers" -> t.asJson), t.description.map(t => "description" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonTemplateDeclaration: Decoder[TemplateDeclaration] = Decoder.instance { c => for { name <- c.downField("name").as[String] cast <- c.downField("cast").as[Option[Map[String, String]]] } yield { TemplateDeclaration( name = name, cast = cast ) } } implicit def encodeApibuilderApiJsonTemplateDeclaration: Encoder[TemplateDeclaration] = Encoder.instance { t => Json.fromFields(Seq( Some("name" -> t.name.asJson), t.cast.map(t => "cast" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonTemplates: Decoder[Templates] = Decoder.instance { c => for { models <- c.downField("models").as[Option[Map[String, io.apibuilder.api.json.v0.models.Model]]] resources <- c.downField("resources").as[Option[Map[String, io.apibuilder.api.json.v0.models.Resource]]] } yield { Templates( models = models, resources = resources ) } } implicit def encodeApibuilderApiJsonTemplates: Encoder[Templates] = Encoder.instance { t => Json.fromFields(Seq( t.models.map(t => "models" -> t.asJson), t.resources.map(t => "resources" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonUnion: Decoder[Union] = Decoder.instance { c => for { plural <- c.downField("plural").as[Option[String]] discriminator <- c.downField("discriminator").as[Option[String]] description <- c.downField("description").as[Option[String]] types <- c.downField("types").as[Seq[io.apibuilder.api.json.v0.models.UnionType]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] interfaces <- c.downField("interfaces").as[Option[Seq[String]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { Union( plural = plural, discriminator = discriminator, description = description, types = types, attributes = attributes, interfaces = interfaces, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonUnion: Encoder[Union] = Encoder.instance { t => Json.fromFields(Seq( t.plural.map(t => "plural" -> t.asJson), t.discriminator.map(t => "discriminator" -> t.asJson), t.description.map(t => "description" -> t.asJson), Some("types" -> t.types.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.interfaces.map(t => "interfaces" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } implicit def decodeApibuilderApiJsonUnionType: Decoder[UnionType] = Decoder.instance { c => for { __type__ <- c.downField("type").as[String] description <- c.downField("description").as[Option[String]] default <- c.downField("default").as[Option[Boolean]] discriminatorValue <- c.downField("discriminator_value").as[Option[String]] attributes <- c.downField("attributes").as[Option[Seq[io.apibuilder.api.json.v0.models.Attribute]]] deprecation <- c.downField("deprecation").as[Option[io.apibuilder.api.json.v0.models.Deprecation]] } yield { UnionType( `type` = __type__, description = description, default = default.getOrElse(false), discriminatorValue = discriminatorValue, attributes = attributes, deprecation = deprecation ) } } implicit def encodeApibuilderApiJsonUnionType: Encoder[UnionType] = Encoder.instance { t => Json.fromFields(Seq( Some("type" -> t.`type`.asJson), t.description.map(t => "description" -> t.asJson), Some("default" -> t.default.asJson), t.discriminatorValue.map(t => "discriminator_value" -> t.asJson), t.attributes.map(t => "attributes" -> t.asJson), t.deprecation.map(t => "deprecation" -> t.asJson) ).flatten) } } } package io.apibuilder.api.json.v0 { import cats.effect._ import cats.implicits._ import io.circe.syntax._ object Constants { val Namespace = "io.apibuilder.api.json.v0" val UserAgent = "apibuilder app.apibuilder.io/apicollective/apibuilder-api-json/0.16.53/http4s_0_23" val Version = "0.16.53" val VersionMajor = 0 } class Client[F[_]: Concurrent]( val baseUrl: org.http4s.Uri, auth: scala.Option[io.apibuilder.api.json.v0.Authorization] = None, defaultHeaders: Seq[(String, String)] = Nil, httpClient: org.http4s.client.Client[F] ) extends interfaces.Client[F] { import org.http4s.Response import io.apibuilder.api.json.v0.models.json._ private lazy val defaultApiHeaders = Seq( ("User-Agent", Constants.UserAgent), ("X-Apidoc-Version", Constants.Version), ("X-Apidoc-Version-Major", Constants.VersionMajor.toString) ) def apiHeaders: Seq[(String, String)] = defaultApiHeaders def modifyRequest(request: org.http4s.Request[F]): org.http4s.Request[F] = request implicit def circeJsonEncoder[F[_]: Concurrent, A](implicit encoder: io.circe.Encoder[A]) = org.http4s.circe.jsonEncoderOf[F, A] def _executeRequest[T, U]( method: String, path: Seq[String], queryParameters: Seq[(String, String)] = Nil, requestHeaders: Seq[(String, String)] = Nil, body: Option[T] = None, formBody : Option[org.http4s.UrlForm] = None )(handler: org.http4s.Response[F] => F[U] )(implicit encoder: io.circe.Encoder[T]): F[U] = { import org.http4s.QueryParamEncoder._ val m = org.http4s.Method.fromString(method) match { case Right(m) => m case Left(e) => sys.error(e.toString) } val headers = org.http4s.Headers(( apiHeaders ++ defaultHeaders ++ requestHeaders ).groupBy(_._1).map { case (k, l) => org.http4s.Header.Raw(org.typelevel.ci.CIString(k), l.last._2) }.toList) val queryMap = queryParameters.groupBy(_._1).map { case (k, v) => k -> v.map(_._2) } val uri = path.foldLeft(baseUrl){ case (uri, segment) => uri / segment }.setQueryParams(queryMap) val request = org.http4s.Request[F](method = m, uri = uri, headers = headers) val reqAndMaybeAuth = auth.fold(request) { case Authorization.Basic(username, passwordOpt) => { val userpass = s"$username:${passwordOpt.getOrElse("")}" val token = java.util.Base64.getEncoder.encodeToString(userpass.getBytes(java.nio.charset.StandardCharsets.ISO_8859_1)) request.putHeaders(org.http4s.Header.Raw(org.typelevel.ci.CIString("Authorization"), s"Basic $token")) } case a => sys.error("Invalid authorization scheme[" + a.getClass + "]") } val reqAndMaybeAuthAndBody = if (formBody.nonEmpty) formBody.fold(reqAndMaybeAuth)(reqAndMaybeAuth.withEntity) else body.fold(reqAndMaybeAuth)(reqAndMaybeAuth.withEntity) httpClient.fetch(modifyRequest(reqAndMaybeAuthAndBody))(handler) } } object Client { import cats.effect._ implicit def circeJsonDecoder[F[_]: Concurrent, A](implicit decoder: io.circe.Decoder[A]) = org.http4s.circe.jsonOf[F, A] def parseJson[F[_]: Concurrent, T]( className: String, r: org.http4s.Response[F] )(implicit decoder: io.circe.Decoder[T]): F[T] = r.attemptAs[T].value.flatMap { case Right(value) => Concurrent[F].pure(value) case Left(error) => Concurrent[F].raiseError(new io.apibuilder.api.json.v0.errors.FailedRequest(r.status.code, s"Invalid json for class[" + className + "]", None, error)) } } sealed trait Authorization extends _root_.scala.Product with _root_.scala.Serializable object Authorization { final case class Basic(username: String, password: Option[String] = None) extends Authorization } package interfaces { trait Client[F[_]] { def baseUrl: org.http4s.Uri } } package errors { final case class FailedRequest(responseCode: Int, message: String, requestUri: Option[_root_.java.net.URI] = None, parent: Exception = null) extends _root_.java.lang.Exception(s"HTTP $responseCode: $message", parent) } }