从 class 隐式获取类型为 Alias 的架构
Implicitly getting Schema from class with type Alias
我目前正在使用 sttp 版本 3.3.14 和 貘版本 0.18.0-M15,我遇到了问题某些情况下的模式 类。更具体地说,包含类型别名的案例 类。
这是一个简单的自定义编解码器:
import cats.implicits._
import io.circe.syntax._
import io.circe.{Codec, Decoder, Encoder}
import sttp.tapir.Schema
import io.circe.generic.semiauto._
import sttp.tapir.generic.auto._
object codecs {
private def eitherDecoder[A, B](implicit a: Decoder[A], b: Decoder[B]): Decoder[Either[A, B]] = a.map(_.asLeft[B]) or b.map(_.asRight[A])
private def eitherEncoder[A, B](implicit a: Encoder[A], b: Encoder[B]): Encoder[Either[A, B]] =
Encoder.instance(_.fold(_.asJson, _.asJson))
implicit def eitherCodec[A, B](implicit aE: Encoder[A], bE: Encoder[B], a: Decoder[A], b: Decoder[B]): Codec[Either[A, B]] =
Codec.from(eitherDecoder, eitherEncoder)
}
以下代码工作正常:
object SuccessCase extends App {
import codecs.eitherCodec
case class Cls(i: Either[String, Int])
implicit val codec: Codec[Cls] = deriveCodec[Cls]
val schema = implicitly[Schema[Cls]]
}
但是这个测试用例失败了。请注意,唯一的区别是 Either 别名。
object FailureCase extends App {
import codecs.eitherCodec
type EitherAlias = Either[String, Int]
case class Cls(i: EitherAlias)
implicit val codec: Codec[Cls] = deriveCodec[Cls]
val schema = implicitly[Schema[Cls]]
//Fails with error:
// Could not find Schema for type com.xxx.FailureCase.Cls.
// Since 0.17.0 automatic derivation requires the following import: `import sttp.tapir.generic.auto._`
// You can find more details in the docs: https://tapir.softwaremill.com/en/latest/endpoint/customtypes.html#schema-derivation
// When using datatypes integration remember to import respective schemas/codecs as described in https://tapir.softwaremill.com/en/latest/endpoint/integrations.html
// val schema = implicitly[Schema[Cls]]
// (sttp.tapir.generic.auto._ is imported)
}
知道这里可能有什么问题或如何解决这个问题吗?
谢谢!
正在使用貘版本 0.18.0-M15
。问题似乎已在版本 0.19
中解决
我目前正在使用 sttp 版本 3.3.14 和 貘版本 0.18.0-M15,我遇到了问题某些情况下的模式 类。更具体地说,包含类型别名的案例 类。
这是一个简单的自定义编解码器:
import cats.implicits._
import io.circe.syntax._
import io.circe.{Codec, Decoder, Encoder}
import sttp.tapir.Schema
import io.circe.generic.semiauto._
import sttp.tapir.generic.auto._
object codecs {
private def eitherDecoder[A, B](implicit a: Decoder[A], b: Decoder[B]): Decoder[Either[A, B]] = a.map(_.asLeft[B]) or b.map(_.asRight[A])
private def eitherEncoder[A, B](implicit a: Encoder[A], b: Encoder[B]): Encoder[Either[A, B]] =
Encoder.instance(_.fold(_.asJson, _.asJson))
implicit def eitherCodec[A, B](implicit aE: Encoder[A], bE: Encoder[B], a: Decoder[A], b: Decoder[B]): Codec[Either[A, B]] =
Codec.from(eitherDecoder, eitherEncoder)
}
以下代码工作正常:
object SuccessCase extends App {
import codecs.eitherCodec
case class Cls(i: Either[String, Int])
implicit val codec: Codec[Cls] = deriveCodec[Cls]
val schema = implicitly[Schema[Cls]]
}
但是这个测试用例失败了。请注意,唯一的区别是 Either 别名。
object FailureCase extends App {
import codecs.eitherCodec
type EitherAlias = Either[String, Int]
case class Cls(i: EitherAlias)
implicit val codec: Codec[Cls] = deriveCodec[Cls]
val schema = implicitly[Schema[Cls]]
//Fails with error:
// Could not find Schema for type com.xxx.FailureCase.Cls.
// Since 0.17.0 automatic derivation requires the following import: `import sttp.tapir.generic.auto._`
// You can find more details in the docs: https://tapir.softwaremill.com/en/latest/endpoint/customtypes.html#schema-derivation
// When using datatypes integration remember to import respective schemas/codecs as described in https://tapir.softwaremill.com/en/latest/endpoint/integrations.html
// val schema = implicitly[Schema[Cls]]
// (sttp.tapir.generic.auto._ is imported)
}
知道这里可能有什么问题或如何解决这个问题吗?
谢谢!
正在使用貘版本 0.18.0-M15
。问题似乎已在版本 0.19