/** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.0.1-dev * User agent: apibuilder app.apibuilder.io/chenggit/flowerate/0.0.1-dev/play_2_9_scala_3_client */ package io.cheng.flowerate.v0.models { /** * Models rates response from fixer io */ sealed trait FixerRateResponse extends _root_.scala.Product with _root_.scala.Serializable /** * fixer.io error detail inside a failure response * * @param code error code * @param `type` fixer.io error type */ final case class FixerErrorDetail( code: Long, `type`: String ) /** * fixer.io failure response for exchange rate between two currencies * * @param success response status, should be false in this case * @param error error from fixer.io */ final case class FixerRatesFailureResponse( success: Boolean, error: io.cheng.flowerate.v0.models.FixerErrorDetail ) extends FixerRateResponse /** * fixer.io response for exchange rate between two currencies * * @param success response status, should be true in this case * @param base base currency * @param rates target currencies * @param timestamp epoch timestamp of returned exchange rate */ final case class FixerRatesSuccessResponse( success: Boolean, base: io.cheng.flowerate.v0.models.Currency, rates: Map[String, Double], timestamp: Long ) extends FixerRateResponse /** * flowerate response for exchange rate between two currencies * * @param base base currency * @param target targey currency * @param rate exchange rate, target currency to base currency * @param timestamp epoch timestamp of returned exchange rate */ final case class RateBetweenResponse( base: io.cheng.flowerate.v0.models.Currency, target: io.cheng.flowerate.v0.models.Currency, rate: Double, timestamp: Long ) /** * flowerate response for exchange rate for base currency to all currencies * * @param base base currency * @param rates target currencies * @param timestamp epoch timestamp of returned exchange rate */ final case class RateToAllResponse( base: io.cheng.flowerate.v0.models.Currency, rates: Map[String, Double], timestamp: Long ) /** * describe subscribed action and corresponding url of a webhook * * @param currencyRateEvent enum value, currency rate event that this webhook subscribe to * @param url where POST request to when subscribed event happens */ final case class WebhookDetail( currencyRateEvent: io.cheng.flowerate.v0.models.CurrencyRateEvent, url: String ) /** * payload of POST request to register a webhook * * @param clientId user id * @param webhooks a sequence of webhook details */ final case class WebhookRegisterRequest( clientId: String, webhooks: Seq[io.cheng.flowerate.v0.models.WebhookDetail] ) /** * Provides future compatibility in clients - in the future, when a type is added * to the union FixerRateResponse, 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 FixerRateResponseUndefinedType( description: String ) extends FixerRateResponse sealed trait Currency extends _root_.scala.Product with _root_.scala.Serializable object Currency { case object Aed extends Currency { override def toString = "AED" } case object Afn extends Currency { override def toString = "AFN" } case object All extends Currency { override def toString = "ALL" } case object Amd extends Currency { override def toString = "AMD" } case object Ang extends Currency { override def toString = "ANG" } case object Aoa extends Currency { override def toString = "AOA" } case object Ars extends Currency { override def toString = "ARS" } case object Aud extends Currency { override def toString = "AUD" } case object Awg extends Currency { override def toString = "AWG" } case object Azn extends Currency { override def toString = "AZN" } case object Bam extends Currency { override def toString = "BAM" } case object Bbd extends Currency { override def toString = "BBD" } case object Bdt extends Currency { override def toString = "BDT" } case object Bgn extends Currency { override def toString = "BGN" } case object Bhd extends Currency { override def toString = "BHD" } case object Bif extends Currency { override def toString = "BIF" } case object Bmd extends Currency { override def toString = "BMD" } case object Bnd extends Currency { override def toString = "BND" } case object Bob extends Currency { override def toString = "BOB" } case object Brl extends Currency { override def toString = "BRL" } case object Bsd extends Currency { override def toString = "BSD" } case object Btc extends Currency { override def toString = "BTC" } case object Btn extends Currency { override def toString = "BTN" } case object Bwp extends Currency { override def toString = "BWP" } case object Byn extends Currency { override def toString = "BYN" } case object Byr extends Currency { override def toString = "BYR" } case object Bzd extends Currency { override def toString = "BZD" } case object Cad extends Currency { override def toString = "CAD" } case object Cdf extends Currency { override def toString = "CDF" } case object Chf extends Currency { override def toString = "CHF" } case object Clf extends Currency { override def toString = "CLF" } case object Clp extends Currency { override def toString = "CLP" } case object Cny extends Currency { override def toString = "CNY" } case object Cop extends Currency { override def toString = "COP" } case object Crc extends Currency { override def toString = "CRC" } case object Cuc extends Currency { override def toString = "CUC" } case object Cup extends Currency { override def toString = "CUP" } case object Cve extends Currency { override def toString = "CVE" } case object Czk extends Currency { override def toString = "CZK" } case object Djf extends Currency { override def toString = "DJF" } case object Dkk extends Currency { override def toString = "DKK" } case object Dop extends Currency { override def toString = "DOP" } case object Dzd extends Currency { override def toString = "DZD" } case object Egp extends Currency { override def toString = "EGP" } case object Ern extends Currency { override def toString = "ERN" } case object Etb extends Currency { override def toString = "ETB" } case object Eur extends Currency { override def toString = "EUR" } case object Fjd extends Currency { override def toString = "FJD" } case object Fkp extends Currency { override def toString = "FKP" } case object Gbp extends Currency { override def toString = "GBP" } case object Gel extends Currency { override def toString = "GEL" } case object Ggp extends Currency { override def toString = "GGP" } case object Ghs extends Currency { override def toString = "GHS" } case object Gip extends Currency { override def toString = "GIP" } case object Gmd extends Currency { override def toString = "GMD" } case object Gnf extends Currency { override def toString = "GNF" } case object Gtq extends Currency { override def toString = "GTQ" } case object Gyd extends Currency { override def toString = "GYD" } case object Hkd extends Currency { override def toString = "HKD" } case object Hnl extends Currency { override def toString = "HNL" } case object Hrk extends Currency { override def toString = "HRK" } case object Htg extends Currency { override def toString = "HTG" } case object Huf extends Currency { override def toString = "HUF" } case object Idr extends Currency { override def toString = "IDR" } case object Ils extends Currency { override def toString = "ILS" } case object Imp extends Currency { override def toString = "IMP" } case object Inr extends Currency { override def toString = "INR" } case object Iqd extends Currency { override def toString = "IQD" } case object Irr extends Currency { override def toString = "IRR" } case object Isk extends Currency { override def toString = "ISK" } case object Jep extends Currency { override def toString = "JEP" } case object Jmd extends Currency { override def toString = "JMD" } case object Jod extends Currency { override def toString = "JOD" } case object Jpy extends Currency { override def toString = "JPY" } case object Kes extends Currency { override def toString = "KES" } case object Kgs extends Currency { override def toString = "KGS" } case object Khr extends Currency { override def toString = "KHR" } case object Kmf extends Currency { override def toString = "KMF" } case object Kpw extends Currency { override def toString = "KPW" } case object Krw extends Currency { override def toString = "KRW" } case object Kwd extends Currency { override def toString = "KWD" } case object Kyd extends Currency { override def toString = "KYD" } case object Kzt extends Currency { override def toString = "KZT" } case object Lak extends Currency { override def toString = "LAK" } case object Lbp extends Currency { override def toString = "LBP" } case object Lkr extends Currency { override def toString = "LKR" } case object Lrd extends Currency { override def toString = "LRD" } case object Lsl extends Currency { override def toString = "LSL" } case object Ltl extends Currency { override def toString = "LTL" } case object Lvl extends Currency { override def toString = "LVL" } case object Lyd extends Currency { override def toString = "LYD" } case object Mad extends Currency { override def toString = "MAD" } case object Mdl extends Currency { override def toString = "MDL" } case object Mga extends Currency { override def toString = "MGA" } case object Mkd extends Currency { override def toString = "MKD" } case object Mmk extends Currency { override def toString = "MMK" } case object Mnt extends Currency { override def toString = "MNT" } case object Mop extends Currency { override def toString = "MOP" } case object Mro extends Currency { override def toString = "MRO" } case object Mur extends Currency { override def toString = "MUR" } case object Mvr extends Currency { override def toString = "MVR" } case object Mwk extends Currency { override def toString = "MWK" } case object Mxn extends Currency { override def toString = "MXN" } case object Myr extends Currency { override def toString = "MYR" } case object Mzn extends Currency { override def toString = "MZN" } case object Nad extends Currency { override def toString = "NAD" } case object Ngn extends Currency { override def toString = "NGN" } case object Nio extends Currency { override def toString = "NIO" } case object Nok extends Currency { override def toString = "NOK" } case object Npr extends Currency { override def toString = "NPR" } case object Nzd extends Currency { override def toString = "NZD" } case object Omr extends Currency { override def toString = "OMR" } case object Pab extends Currency { override def toString = "PAB" } case object Pen extends Currency { override def toString = "PEN" } case object Pgk extends Currency { override def toString = "PGK" } case object Php extends Currency { override def toString = "PHP" } case object Pkr extends Currency { override def toString = "PKR" } case object Pln extends Currency { override def toString = "PLN" } case object Pyg extends Currency { override def toString = "PYG" } case object Qar extends Currency { override def toString = "QAR" } case object Ron extends Currency { override def toString = "RON" } case object Rsd extends Currency { override def toString = "RSD" } case object Rub extends Currency { override def toString = "RUB" } case object Rwf extends Currency { override def toString = "RWF" } case object Sar extends Currency { override def toString = "SAR" } case object Sbd extends Currency { override def toString = "SBD" } case object Scr extends Currency { override def toString = "SCR" } case object Sdg extends Currency { override def toString = "SDG" } case object Sek extends Currency { override def toString = "SEK" } case object Sgd extends Currency { override def toString = "SGD" } case object Shp extends Currency { override def toString = "SHP" } case object Sll extends Currency { override def toString = "SLL" } case object Sos extends Currency { override def toString = "SOS" } case object Srd extends Currency { override def toString = "SRD" } case object Std extends Currency { override def toString = "STD" } case object Svc extends Currency { override def toString = "SVC" } case object Syp extends Currency { override def toString = "SYP" } case object Szl extends Currency { override def toString = "SZL" } case object Thb extends Currency { override def toString = "THB" } case object Tjs extends Currency { override def toString = "TJS" } case object Tmt extends Currency { override def toString = "TMT" } case object Tnd extends Currency { override def toString = "TND" } case object Top extends Currency { override def toString = "TOP" } case object Try extends Currency { override def toString = "TRY" } case object Ttd extends Currency { override def toString = "TTD" } case object Twd extends Currency { override def toString = "TWD" } case object Tzs extends Currency { override def toString = "TZS" } case object Uah extends Currency { override def toString = "UAH" } case object Ugx extends Currency { override def toString = "UGX" } case object Usd extends Currency { override def toString = "USD" } case object Uyu extends Currency { override def toString = "UYU" } case object Uzs extends Currency { override def toString = "UZS" } case object Vef extends Currency { override def toString = "VEF" } case object Vnd extends Currency { override def toString = "VND" } case object Vuv extends Currency { override def toString = "VUV" } case object Wst extends Currency { override def toString = "WST" } case object Xaf extends Currency { override def toString = "XAF" } case object Xag extends Currency { override def toString = "XAG" } case object Xau extends Currency { override def toString = "XAU" } case object Xcd extends Currency { override def toString = "XCD" } case object Xdr extends Currency { override def toString = "XDR" } case object Xof extends Currency { override def toString = "XOF" } case object Xpf extends Currency { override def toString = "XPF" } case object Yer extends Currency { override def toString = "YER" } case object Zar extends Currency { override def toString = "ZAR" } case object Zmk extends Currency { override def toString = "ZMK" } case object Zmw extends Currency { override def toString = "ZMW" } case object Zwl extends Currency { override def toString = "ZWL" } /** * 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 Currency /** * 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[Currency] = scala.List(Aed, Afn, All, Amd, Ang, Aoa, Ars, Aud, Awg, Azn, Bam, Bbd, Bdt, Bgn, Bhd, Bif, Bmd, Bnd, Bob, Brl, Bsd, Btc, Btn, Bwp, Byn, Byr, Bzd, Cad, Cdf, Chf, Clf, Clp, Cny, Cop, Crc, Cuc, Cup, Cve, Czk, Djf, Dkk, Dop, Dzd, Egp, Ern, Etb, Eur, Fjd, Fkp, Gbp, Gel, Ggp, Ghs, Gip, Gmd, Gnf, Gtq, Gyd, Hkd, Hnl, Hrk, Htg, Huf, Idr, Ils, Imp, Inr, Iqd, Irr, Isk, Jep, Jmd, Jod, Jpy, Kes, Kgs, Khr, Kmf, Kpw, Krw, Kwd, Kyd, Kzt, Lak, Lbp, Lkr, Lrd, Lsl, Ltl, Lvl, Lyd, Mad, Mdl, Mga, Mkd, Mmk, Mnt, Mop, Mro, Mur, Mvr, Mwk, Mxn, Myr, Mzn, Nad, Ngn, Nio, Nok, Npr, Nzd, Omr, Pab, Pen, Pgk, Php, Pkr, Pln, Pyg, Qar, Ron, Rsd, Rub, Rwf, Sar, Sbd, Scr, Sdg, Sek, Sgd, Shp, Sll, Sos, Srd, Std, Svc, Syp, Szl, Thb, Tjs, Tmt, Tnd, Top, Try, Ttd, Twd, Tzs, Uah, Ugx, Usd, Uyu, Uzs, Vef, Vnd, Vuv, Wst, Xaf, Xag, Xau, Xcd, Xdr, Xof, Xpf, Yer, Zar, Zmk, Zmw, Zwl) private val byName: Map[String, Currency] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): Currency = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[Currency] = byName.get(value.toLowerCase) } sealed trait CurrencyRateEvent extends _root_.scala.Product with _root_.scala.Serializable object CurrencyRateEvent { case object CurrencyRateChange extends CurrencyRateEvent { override def toString = "CurrencyRateChange" } /** * 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 CurrencyRateEvent /** * 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[CurrencyRateEvent] = scala.List(CurrencyRateChange) private val byName: Map[String, CurrencyRateEvent] = all.map(x => x.toString.toLowerCase -> x).toMap def apply(value: String): CurrencyRateEvent = fromString(value).getOrElse(UNDEFINED(value)) def fromString(value: String): _root_.scala.Option[CurrencyRateEvent] = byName.get(value.toLowerCase) } } package io.cheng.flowerate.v0.models { package object json { import play.api.libs.json.__ import play.api.libs.json.JsString import play.api.libs.json.Writes import play.api.libs.functional.syntax._ import io.cheng.flowerate.v0.models.json._ private[v0] implicit val jsonReadsUUID: play.api.libs.json.Reads[_root_.java.util.UUID] = __.read[String].map { str => _root_.java.util.UUID.fromString(str) } private[v0] implicit val jsonWritesUUID: play.api.libs.json.Writes[_root_.java.util.UUID] = (x: _root_.java.util.UUID) => play.api.libs.json.JsString(x.toString) private[v0] implicit val jsonReadsJodaDateTime: play.api.libs.json.Reads[_root_.org.joda.time.DateTime] = __.read[String].map { str => _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseDateTime(str) } private[v0] implicit val jsonWritesJodaDateTime: play.api.libs.json.Writes[_root_.org.joda.time.DateTime] = (x: _root_.org.joda.time.DateTime) => { play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(x)) } private[v0] implicit val jsonReadsJodaLocalDate: play.api.libs.json.Reads[_root_.org.joda.time.LocalDate] = __.read[String].map { str => _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseLocalDate(str) } private[v0] implicit val jsonWritesJodaLocalDate: play.api.libs.json.Writes[_root_.org.joda.time.LocalDate] = (x: _root_.org.joda.time.LocalDate) => { play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.date.print(x)) } implicit val jsonReadsFlowerateCurrency: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.Currency] = new play.api.libs.json.Reads[io.cheng.flowerate.v0.models.Currency] { def reads(js: play.api.libs.json.JsValue): play.api.libs.json.JsResult[io.cheng.flowerate.v0.models.Currency] = { js match { case v: play.api.libs.json.JsString => play.api.libs.json.JsSuccess(io.cheng.flowerate.v0.models.Currency(v.value)) case _ => { (js \ "value").validate[String] match { case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.cheng.flowerate.v0.models.Currency(v)) case _: play.api.libs.json.JsError => (js \ "currency").validate[String] match { case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.cheng.flowerate.v0.models.Currency(v)) case err: play.api.libs.json.JsError => err } } } } } } def jsonWritesFlowerateCurrency(obj: io.cheng.flowerate.v0.models.Currency) = { play.api.libs.json.JsString(obj.toString) } def jsObjectCurrency(obj: io.cheng.flowerate.v0.models.Currency) = { play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsString(obj.toString)) } implicit def jsonWritesFlowerateCurrency: play.api.libs.json.Writes[Currency] = { (obj: io.cheng.flowerate.v0.models.Currency) => { io.cheng.flowerate.v0.models.json.jsonWritesFlowerateCurrency(obj) } } implicit val jsonReadsFlowerateCurrencyRateEvent: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.CurrencyRateEvent] = new play.api.libs.json.Reads[io.cheng.flowerate.v0.models.CurrencyRateEvent] { def reads(js: play.api.libs.json.JsValue): play.api.libs.json.JsResult[io.cheng.flowerate.v0.models.CurrencyRateEvent] = { js match { case v: play.api.libs.json.JsString => play.api.libs.json.JsSuccess(io.cheng.flowerate.v0.models.CurrencyRateEvent(v.value)) case _ => { (js \ "value").validate[String] match { case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.cheng.flowerate.v0.models.CurrencyRateEvent(v)) case _: play.api.libs.json.JsError => (js \ "currencyRateEvent").validate[String] match { case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.cheng.flowerate.v0.models.CurrencyRateEvent(v)) case err: play.api.libs.json.JsError => err } } } } } } def jsonWritesFlowerateCurrencyRateEvent(obj: io.cheng.flowerate.v0.models.CurrencyRateEvent) = { play.api.libs.json.JsString(obj.toString) } def jsObjectCurrencyRateEvent(obj: io.cheng.flowerate.v0.models.CurrencyRateEvent) = { play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsString(obj.toString)) } implicit def jsonWritesFlowerateCurrencyRateEvent: play.api.libs.json.Writes[CurrencyRateEvent] = { (obj: io.cheng.flowerate.v0.models.CurrencyRateEvent) => { io.cheng.flowerate.v0.models.json.jsonWritesFlowerateCurrencyRateEvent(obj) } } implicit def jsonReadsFlowerateFixerErrorDetail: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.FixerErrorDetail] = { for { code <- (__ \ "code").read[Long] `type` <- (__ \ "type").read[String] } yield FixerErrorDetail(code, `type`) } def jsObjectFixerErrorDetail(obj: io.cheng.flowerate.v0.models.FixerErrorDetail): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "code" -> play.api.libs.json.JsNumber(obj.code), "type" -> play.api.libs.json.JsString(obj.`type`) ) } implicit def jsonWritesFlowerateFixerErrorDetail: play.api.libs.json.Writes[FixerErrorDetail] = { (obj: io.cheng.flowerate.v0.models.FixerErrorDetail) => { io.cheng.flowerate.v0.models.json.jsObjectFixerErrorDetail(obj) } } def jsonReadsFlowerateFixerRatesFailureResponse: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.FixerRatesFailureResponse] = { for { success <- (__ \ "success").read[Boolean] error <- (__ \ "error").read[io.cheng.flowerate.v0.models.FixerErrorDetail] } yield FixerRatesFailureResponse(success, error) } def jsObjectFixerRatesFailureResponse(obj: io.cheng.flowerate.v0.models.FixerRatesFailureResponse): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "success" -> play.api.libs.json.JsBoolean(obj.success), "error" -> io.cheng.flowerate.v0.models.json.jsObjectFixerErrorDetail(obj.error) ) } def jsonWritesFlowerateFixerRatesFailureResponse: play.api.libs.json.Writes[FixerRatesFailureResponse] = { (obj: io.cheng.flowerate.v0.models.FixerRatesFailureResponse) => { io.cheng.flowerate.v0.models.json.jsObjectFixerRatesFailureResponse(obj) } } def jsonReadsFlowerateFixerRatesSuccessResponse: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.FixerRatesSuccessResponse] = { for { success <- (__ \ "success").read[Boolean] base <- (__ \ "base").read[io.cheng.flowerate.v0.models.Currency] rates <- (__ \ "rates").read[Map[String, Double]] timestamp <- (__ \ "timestamp").read[Long] } yield FixerRatesSuccessResponse(success, base, rates, timestamp) } def jsObjectFixerRatesSuccessResponse(obj: io.cheng.flowerate.v0.models.FixerRatesSuccessResponse): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "success" -> play.api.libs.json.JsBoolean(obj.success), "base" -> play.api.libs.json.JsString(obj.base.toString), "rates" -> play.api.libs.json.Json.toJson(obj.rates), "timestamp" -> play.api.libs.json.JsNumber(obj.timestamp) ) } def jsonWritesFlowerateFixerRatesSuccessResponse: play.api.libs.json.Writes[FixerRatesSuccessResponse] = { (obj: io.cheng.flowerate.v0.models.FixerRatesSuccessResponse) => { io.cheng.flowerate.v0.models.json.jsObjectFixerRatesSuccessResponse(obj) } } implicit def jsonReadsFlowerateRateBetweenResponse: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.RateBetweenResponse] = { for { base <- (__ \ "base").read[io.cheng.flowerate.v0.models.Currency] target <- (__ \ "target").read[io.cheng.flowerate.v0.models.Currency] rate <- (__ \ "rate").read[Double] timestamp <- (__ \ "timestamp").read[Long] } yield RateBetweenResponse(base, target, rate, timestamp) } def jsObjectRateBetweenResponse(obj: io.cheng.flowerate.v0.models.RateBetweenResponse): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "base" -> play.api.libs.json.JsString(obj.base.toString), "target" -> play.api.libs.json.JsString(obj.target.toString), "rate" -> play.api.libs.json.JsNumber(obj.rate), "timestamp" -> play.api.libs.json.JsNumber(obj.timestamp) ) } implicit def jsonWritesFlowerateRateBetweenResponse: play.api.libs.json.Writes[RateBetweenResponse] = { (obj: io.cheng.flowerate.v0.models.RateBetweenResponse) => { io.cheng.flowerate.v0.models.json.jsObjectRateBetweenResponse(obj) } } implicit def jsonReadsFlowerateRateToAllResponse: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.RateToAllResponse] = { for { base <- (__ \ "base").read[io.cheng.flowerate.v0.models.Currency] rates <- (__ \ "rates").read[Map[String, Double]] timestamp <- (__ \ "timestamp").read[Long] } yield RateToAllResponse(base, rates, timestamp) } def jsObjectRateToAllResponse(obj: io.cheng.flowerate.v0.models.RateToAllResponse): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "base" -> play.api.libs.json.JsString(obj.base.toString), "rates" -> play.api.libs.json.Json.toJson(obj.rates), "timestamp" -> play.api.libs.json.JsNumber(obj.timestamp) ) } implicit def jsonWritesFlowerateRateToAllResponse: play.api.libs.json.Writes[RateToAllResponse] = { (obj: io.cheng.flowerate.v0.models.RateToAllResponse) => { io.cheng.flowerate.v0.models.json.jsObjectRateToAllResponse(obj) } } implicit def jsonReadsFlowerateWebhookDetail: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.WebhookDetail] = { for { currencyRateEvent <- (__ \ "currencyRateEvent").read[io.cheng.flowerate.v0.models.CurrencyRateEvent] url <- (__ \ "url").read[String] } yield WebhookDetail(currencyRateEvent, url) } def jsObjectWebhookDetail(obj: io.cheng.flowerate.v0.models.WebhookDetail): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "currencyRateEvent" -> play.api.libs.json.JsString(obj.currencyRateEvent.toString), "url" -> play.api.libs.json.JsString(obj.url) ) } implicit def jsonWritesFlowerateWebhookDetail: play.api.libs.json.Writes[WebhookDetail] = { (obj: io.cheng.flowerate.v0.models.WebhookDetail) => { io.cheng.flowerate.v0.models.json.jsObjectWebhookDetail(obj) } } implicit def jsonReadsFlowerateWebhookRegisterRequest: play.api.libs.json.Reads[io.cheng.flowerate.v0.models.WebhookRegisterRequest] = { for { clientId <- (__ \ "clientId").read[String] webhooks <- (__ \ "webhooks").read[Seq[io.cheng.flowerate.v0.models.WebhookDetail]] } yield WebhookRegisterRequest(clientId, webhooks) } def jsObjectWebhookRegisterRequest(obj: io.cheng.flowerate.v0.models.WebhookRegisterRequest): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "clientId" -> play.api.libs.json.JsString(obj.clientId), "webhooks" -> play.api.libs.json.Json.toJson(obj.webhooks) ) } implicit def jsonWritesFlowerateWebhookRegisterRequest: play.api.libs.json.Writes[WebhookRegisterRequest] = { (obj: io.cheng.flowerate.v0.models.WebhookRegisterRequest) => { io.cheng.flowerate.v0.models.json.jsObjectWebhookRegisterRequest(obj) } } implicit def jsonReadsFlowerateFixerRateResponse[T <: io.cheng.flowerate.v0.models.FixerRateResponse]: play.api.libs.json.Reads[T] = (json: play.api.libs.json.JsValue) => { Seq( jsonReadsFlowerateFixerRatesSuccessResponse.reads(json).map(_.asInstanceOf[T]), jsonReadsFlowerateFixerRatesFailureResponse.reads(json).map(_.asInstanceOf[T]) ).view.find(_.isSuccess).getOrElse { play.api.libs.json.JsSuccess(FixerRateResponseUndefinedType(json.toString).asInstanceOf[T]) } } implicit def jsonReadsFlowerateFixerRateResponseSeq[T <: io.cheng.flowerate.v0.models.FixerRateResponse]: play.api.libs.json.Reads[Seq[T]] = { case a: play.api.libs.json.JsArray => { val all: Seq[play.api.libs.json.JsResult[io.cheng.flowerate.v0.models.FixerRateResponse]] = a.value.map(jsonReadsFlowerateFixerRateResponse.reads).toSeq all.collect { case e: play.api.libs.json.JsError => e }.toList match { case Nil => play.api.libs.json.JsSuccess(all.collect { case play.api.libs.json.JsSuccess(v, _) => v.asInstanceOf[T] }) case errors => play.api.libs.json.JsError(play.api.libs.json.JsError.merge(errors.flatMap(_.errors), Nil)) } } case other => play.api.libs.json.JsError(s"Expected array but found [" + other.getClass.getName + "]") } def jsObjectFixerRateResponse(obj: io.cheng.flowerate.v0.models.FixerRateResponse): play.api.libs.json.JsObject = { obj match { case x: io.cheng.flowerate.v0.models.FixerRatesSuccessResponse => play.api.libs.json.Json.obj("FixerRatesSuccessResponse" -> io.cheng.flowerate.v0.models.json.jsObjectFixerRatesSuccessResponse(x)) case x: io.cheng.flowerate.v0.models.FixerRatesFailureResponse => play.api.libs.json.Json.obj("FixerRatesFailureResponse" -> io.cheng.flowerate.v0.models.json.jsObjectFixerRatesFailureResponse(x)) case x: io.cheng.flowerate.v0.models.FixerRateResponseUndefinedType => { scala.util.Try { // If we received a JSON object - echo it back. This is a workaround for a bug in // serialization for unions w/out discriminators where they sometimes have the // type wrapper and sometimes do not play.api.libs.json.Json.parse(x.description).asInstanceOf[play.api.libs.json.JsObject] } match { case scala.util.Success(o) => o case scala.util.Failure(_) => sys.error("The type[io.cheng.flowerate.v0.models.FixerRateResponseUndefinedType] should never be serialized") } } } } implicit def jsonWritesFlowerateFixerRateResponse[T <: io.cheng.flowerate.v0.models.FixerRateResponse]: play.api.libs.json.Writes[T] = { (obj: io.cheng.flowerate.v0.models.FixerRateResponse) => { io.cheng.flowerate.v0.models.json.jsObjectFixerRateResponse(obj) } } } } package io.cheng.flowerate.v0 { object Bindables { import play.api.mvc.{PathBindable, QueryStringBindable} // import models directly for backwards compatibility with prior versions of the generator import Core._ import Models._ object Core { implicit def pathBindableDateTimeIso8601(implicit stringBinder: QueryStringBindable[String]): PathBindable[_root_.org.joda.time.DateTime] = ApibuilderPathBindable(ApibuilderTypes.dateTimeIso8601) implicit def queryStringBindableDateTimeIso8601(implicit stringBinder: QueryStringBindable[String]): QueryStringBindable[_root_.org.joda.time.DateTime] = ApibuilderQueryStringBindable(ApibuilderTypes.dateTimeIso8601) implicit def pathBindableDateIso8601(implicit stringBinder: QueryStringBindable[String]): PathBindable[_root_.org.joda.time.LocalDate] = ApibuilderPathBindable(ApibuilderTypes.dateIso8601) implicit def queryStringBindableDateIso8601(implicit stringBinder: QueryStringBindable[String]): QueryStringBindable[_root_.org.joda.time.LocalDate] = ApibuilderQueryStringBindable(ApibuilderTypes.dateIso8601) } object Models { import io.cheng.flowerate.v0.models._ val currencyConverter: ApibuilderTypeConverter[io.cheng.flowerate.v0.models.Currency] = new ApibuilderTypeConverter[io.cheng.flowerate.v0.models.Currency] { override def convert(value: String): io.cheng.flowerate.v0.models.Currency = io.cheng.flowerate.v0.models.Currency(value) override def convert(value: io.cheng.flowerate.v0.models.Currency): String = value.toString override def example: io.cheng.flowerate.v0.models.Currency = io.cheng.flowerate.v0.models.Currency.Aed override def validValues: Seq[io.cheng.flowerate.v0.models.Currency] = io.cheng.flowerate.v0.models.Currency.all } implicit def pathBindableCurrency(implicit stringBinder: QueryStringBindable[String]): PathBindable[io.cheng.flowerate.v0.models.Currency] = ApibuilderPathBindable(currencyConverter) implicit def queryStringBindableCurrency(implicit stringBinder: QueryStringBindable[String]): QueryStringBindable[io.cheng.flowerate.v0.models.Currency] = ApibuilderQueryStringBindable(currencyConverter) val currencyRateEventConverter: ApibuilderTypeConverter[io.cheng.flowerate.v0.models.CurrencyRateEvent] = new ApibuilderTypeConverter[io.cheng.flowerate.v0.models.CurrencyRateEvent] { override def convert(value: String): io.cheng.flowerate.v0.models.CurrencyRateEvent = io.cheng.flowerate.v0.models.CurrencyRateEvent(value) override def convert(value: io.cheng.flowerate.v0.models.CurrencyRateEvent): String = value.toString override def example: io.cheng.flowerate.v0.models.CurrencyRateEvent = io.cheng.flowerate.v0.models.CurrencyRateEvent.CurrencyRateChange override def validValues: Seq[io.cheng.flowerate.v0.models.CurrencyRateEvent] = io.cheng.flowerate.v0.models.CurrencyRateEvent.all } implicit def pathBindableCurrencyRateEvent(implicit stringBinder: QueryStringBindable[String]): PathBindable[io.cheng.flowerate.v0.models.CurrencyRateEvent] = ApibuilderPathBindable(currencyRateEventConverter) implicit def queryStringBindableCurrencyRateEvent(implicit stringBinder: QueryStringBindable[String]): QueryStringBindable[io.cheng.flowerate.v0.models.CurrencyRateEvent] = ApibuilderQueryStringBindable(currencyRateEventConverter) } trait ApibuilderTypeConverter[T] { def convert(value: String): T def convert(value: T): String def example: T def validValues: Seq[T] = Nil def errorMessage(key: String, value: String, ex: java.lang.Exception): String = { val base = s"Invalid value '$value' for parameter '$key'. " validValues.toList match { case Nil => base + "Ex: " + convert(example) case values => base + ". Valid values are: " + values.mkString("'", "', '", "'") } } } object ApibuilderTypes { val dateTimeIso8601: ApibuilderTypeConverter[_root_.org.joda.time.DateTime] = new ApibuilderTypeConverter[_root_.org.joda.time.DateTime] { override def convert(value: String): _root_.org.joda.time.DateTime = _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseDateTime(value) override def convert(value: _root_.org.joda.time.DateTime): String = _root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(value) override def example: _root_.org.joda.time.DateTime = _root_.org.joda.time.DateTime.now } val dateIso8601: ApibuilderTypeConverter[_root_.org.joda.time.LocalDate] = new ApibuilderTypeConverter[_root_.org.joda.time.LocalDate] { override def convert(value: String): _root_.org.joda.time.LocalDate = _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseLocalDate(value) override def convert(value: _root_.org.joda.time.LocalDate): String = _root_.org.joda.time.format.ISODateTimeFormat.date.print(value) override def example: _root_.org.joda.time.LocalDate = _root_.org.joda.time.LocalDate.now } } final case class ApibuilderQueryStringBindable[T]( converters: ApibuilderTypeConverter[T] ) extends QueryStringBindable[T] { override def bind(key: String, params: Map[String, Seq[String]]): _root_.scala.Option[_root_.scala.Either[String, T]] = { params.getOrElse(key, Nil).headOption.map { v => try { Right( converters.convert(v) ) } catch { case ex: java.lang.Exception => Left( converters.errorMessage(key, v, ex) ) } } } override def unbind(key: String, value: T): String = { s"$key=${converters.convert(value)}" } } final case class ApibuilderPathBindable[T]( converters: ApibuilderTypeConverter[T] ) extends PathBindable[T] { override def bind(key: String, value: String): _root_.scala.Either[String, T] = { try { Right( converters.convert(value) ) } catch { case ex: java.lang.Exception => Left( converters.errorMessage(key, value, ex) ) } } override def unbind(key: String, value: T): String = { converters.convert(value) } } } } package io.cheng.flowerate.v0 { object Constants { val Namespace = "io.cheng.flowerate.v0" val UserAgent = "apibuilder app.apibuilder.io/chenggit/flowerate/0.0.1-dev/play_2_9_scala_3_client" val Version = "0.0.1-dev" val VersionMajor = 0 } class Client( ws: play.api.libs.ws.WSClient, val baseUrl: String, auth: scala.Option[io.cheng.flowerate.v0.Authorization] = None, defaultHeaders: Seq[(String, String)] = Nil ) extends interfaces.Client { import io.cheng.flowerate.v0.models.json._ private val logger = play.api.Logger("io.cheng.flowerate.v0.Client") logger.info(s"Initializing io.cheng.flowerate.v0.Client for url $baseUrl") def _requestHolder(path: String): play.api.libs.ws.WSRequest = { val holder = ws.url(baseUrl + path).addHttpHeaders( "User-Agent" -> Constants.UserAgent, "X-Apidoc-Version" -> Constants.Version, "X-Apidoc-Version-Major" -> Constants.VersionMajor.toString ).addHttpHeaders(defaultHeaders*) auth.fold(holder) { case Authorization.Basic(username, password) => { holder.withAuth(username, password.getOrElse(""), play.api.libs.ws.WSAuthScheme.BASIC) } } } def _logRequest(method: String, req: play.api.libs.ws.WSRequest): play.api.libs.ws.WSRequest = { val queryComponents = for { (name, values) <- req.queryString value <- values } yield s"$name=$value" val url = s"${req.url}${queryComponents.mkString("?", "&", "")}" auth.fold(logger.info(s"curl -X $method '$url'")) { _ => logger.info(s"curl -X $method -u '[REDACTED]:' '$url'") } req } def _executeRequest( method: String, path: String, queryParameters: Seq[(String, String)] = Nil, requestHeaders: Seq[(String, String)] = Nil, body: Option[play.api.libs.json.JsValue] = None ): scala.concurrent.Future[play.api.libs.ws.WSResponse] = { import play.api.libs.ws.WSBodyWritables.writeableOf_JsValue method.toUpperCase match { case "GET" => { _logRequest("GET", _requestHolder(path).addHttpHeaders(requestHeaders*).addQueryStringParameters(queryParameters*)).get() } case "POST" => { _logRequest("POST", _requestHolder(path).addHttpHeaders(_withJsonContentType(requestHeaders)*).addQueryStringParameters(queryParameters*)).post(body.getOrElse(play.api.libs.json.Json.obj())) } case "PUT" => { _logRequest("PUT", _requestHolder(path).addHttpHeaders(_withJsonContentType(requestHeaders)*).addQueryStringParameters(queryParameters*)).put(body.getOrElse(play.api.libs.json.Json.obj())) } case "PATCH" => { _logRequest("PATCH", _requestHolder(path).addHttpHeaders(requestHeaders*).addQueryStringParameters(queryParameters*)).patch(body.getOrElse(play.api.libs.json.Json.obj())) } case "DELETE" => { _logRequest("DELETE", _requestHolder(path).addHttpHeaders(requestHeaders*).addQueryStringParameters(queryParameters*)).delete() } case "HEAD" => { _logRequest("HEAD", _requestHolder(path).addHttpHeaders(requestHeaders*).addQueryStringParameters(queryParameters*)).head() } case "OPTIONS" => { _logRequest("OPTIONS", _requestHolder(path).addHttpHeaders(requestHeaders*).addQueryStringParameters(queryParameters*)).options() } case _ => { _logRequest(method, _requestHolder(path).addHttpHeaders(requestHeaders*).addQueryStringParameters(queryParameters*)) sys.error("Unsupported method[%s]".format(method)) } } } /** * Adds a Content-Type: application/json header unless the specified requestHeaders * already contain a Content-Type header */ def _withJsonContentType(headers: Seq[(String, String)]): Seq[(String, String)] = { headers.find { _._1.toUpperCase == "CONTENT-TYPE" } match { case None => headers ++ Seq("Content-Type" -> "application/json; charset=UTF-8") case Some(_) => headers } } } object Client { def parseJson[T]( className: String, r: play.api.libs.ws.WSResponse, f: (play.api.libs.json.JsValue => play.api.libs.json.JsResult[T]) ): T = { f(play.api.libs.json.Json.parse(r.body)) match { case play.api.libs.json.JsSuccess(x, _) => x case play.api.libs.json.JsError(errors) => { throw io.cheng.flowerate.v0.errors.FailedRequest(r.status, s"Invalid json for class[" + className + "]: " + errors.mkString(" ")) } } } } 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 { def baseUrl: String } } package errors { final case class FailedRequest(responseCode: Int, message: String, requestUri: Option[_root_.java.net.URI] = None) extends _root_.java.lang.Exception(s"HTTP $responseCode: $message") } }