- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 ZIO Conf 为代数数据类型手动添加配置描述 .
在examples我找到了一个关于如何使用 Magnolia 处理 ADT 的示例。
手动添加配置说明时是否也可以这样做?
举个例子:
sealed trait Dance
final case class A(any: Person) extends Dance
final case class B(body: Height) extends Dance
final case class Person(name: String, age: Option[Int])
final case class Height(height: Long)
与 Jade 兰:
val danceConfig = description[Dance]
手动:
val danceConfig = ???
最佳答案
如您所料,它很冗长。但是有不同的方法可以做到这一点,这是一个偏好问题。
为了更好地理解,我们试图在这两个选项中都比要求的更详细一些
选项 1:
val personConfig =
(string("name") |@| int("age").optional)(Person.apply, Person.unapply)
val heightConfig =
long("height").xmap(Height)(_.height)
val aConfig = nested("any")(personConfig).xmap(A)(_.any)
val bConfig = nested("body")(heightConfig).xmap(B)(_.body)
val cConfig = boolean("can").xmap(C)(_.can)
val dConfig = string("dance").xmap(D)(_.dance)
val danceConfig =
aConfig
.orElseEither(bConfig)
.orElseEither(cConfig)
.orElseEither(dConfig)
.xmap({
case Right(value) => value: Dance
case Left(value) =>
value match {
case Right(value) => value: Dance
case Left(value) =>
value match {
case Right(value) => value: Dance
case Left(value) => value: Dance
}
}
})({
case d @ D(_) => Right(d)
case c @ C(_) => Left(Right(c))
case b @ B(_) => Left(Left(Right(b)))
case a @ A(_) => Left(Left(Left(a)))
}
)
在写入端有点复杂,但它都是类型驱动的。
选项 2
val personConfig =
(string("name") |@| int("age").optional)(Person.apply, Person.unapply)
val heightConfig =
long("height").xmap(Height)(_.height)
val aConfig = nested("any")(personConfig).xmap(A)(_.any)
val bConfig = nested("body")(heightConfig).xmap(B)(_.body)
val cConfig = boolean("can").xmap(C)(_.can)
val dConfig = string("dance").xmap(D)(_.dance)
val aConfigAsDance =
aConfig.xmapEither(a => Right(a: Dance))({
case a: A => Right(a)
case _ => Left("unable to write back")
})
val bConfigAsDance =
bConfig.xmapEither(a => Right(a: Dance))({
case a: B => Right(a)
case _ => Left("unsable to write back")
})
val cConfigAsDance =
cConfig.xmapEither(a => Right(a: Dance))({
case a: C => Right(a)
case _ => Left("unsable to write back")
})
val dConigAsDance =
dConfig.xmapEither(a => Right(a: Dance))({
case a: D => Right(a)
case _ => Left("unsable to write back")
})
val danceConfig =
aConfigAsDance.orElse(bConfigAsDance).orElse(cConfigAsDance).orElse(dConigAsDance)
您可能已经注意到,在写入部分(xmapEither 的第二个参数)我们确保它是正确的类型。示例:在 aConfigAsDance
中,假设它只能是 A 并执行 asInstanceOf
是不安全的。
有了 xmapeither
,我们能够编写安全和纯净的代码,我们也遵循了它。
在未来,zio-config 会提供一些辅助函数来处理 Either。这是因为 ZIO-Config 的理念是为用户提供尽可能不那么神奇的界面,同时您仍然可以使用 zio-config-magnolia 将它们缩短到只有一行,即
val danceConfig = description[Dance]
如果您有兴趣,很高兴在 zio-config 中恢复这个示例。非常感谢这个问题,希望回答对您有所帮助。
关于scala - 如何使用 ZIO 配置处理 ADT(密封特征),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59670366/
这可能是一个愚蠢的问题,但从 ZIO 开始,我无法将 Seq[ZIO] 转换为 ZIO[Seq]: def translate(keys: Seq[String], locales: Seq[Loca
我创建了我的服务的两个版本。第一个使用 Futures,另一个使用 ZIO 作为效果。 我有一个使用 Future 作为结果效果的简单方法: def get(id: String)(implicit
我有下一个代码: import zio._ import scala.concurrent.Future case class AppError(description: String) extend
我有下一个代码: import zio._ import scala.concurrent.Future case class AppError(description: String) extend
我有一个返回一些 ZIO 的方法: def method(...): ZIO[Any with clock, SomeError, Unit] 调用此方法返回Task[Unit]: def other
(希望)关于 Scalaz Zio 的简单问题。 我有一些重构为 Zio 的旧代码。我希望该代码的一条路径保持原样: 同步 阻塞 在当前线程上(这是一个硬性要求) 我如何运行 IO这样它的行为就像旧的
我正在使用 ZIO:https://github.com/zio/zio 在我的 build.sbt : "dev.zio" %% "zio" % "1.0.0-RC9" 无论我尝试过什么,每次我需要
我想为 abort-early-in-a-fold 添加一个答案对于ZIO。 所以我采用了猫的解决方案:cats solution def sumEvenNumbers(nums: Stream[In
我有一堆 IO,所有这些都可能成功或失败: val result: Seq[IO[MyFailure, MySuccess]] = ... 我需要总结结果,以便我可以一起检查所有失败和所有成功: ca
我在 Scala 中有一个类有四个参数,其中 2 个是变量,我想在 Zio 中使用 Ref 数据类型来控制对这些变量的访问,这是我的代码: import zio._ class Rectangle(v
我找不到有关如何使用 ZIO 测试忽略套件或测试的任何信息。 无论是在示例中还是在文档中( https://zio.dev/docs/usecases/usecases_testing ) 有一个ig
我知道ZIO是维护自己的堆栈,即zio.internal.FiberContext#stack ,它保护递归函数,如 def getNameFromUser(askForName: UIO[Strin
我想按顺序运行两个集成测试。如何在 ZIO Test 中实现这一点? 这是套房: suite("Undeploy a Package")( testM("There is a Package"
scala.js 是否与 scala ZIO 一起使用? 我想在 scala.js 中使用 scala ZIO 我只知道如何在普通应用程序中使用 scala ZIO 有谁知道如何在 scala.js
我有几个 Booleans我想测试,比如 assert(g8Exists, equalTo(true)) && assert(projectExists, equalTo(true)) && asse
我想在 ZIO Fibers 上使用组合器 orElse。 从文档: 如果第一个纤维成功,则合成的纤维将成功,其结果;否则,组成的光纤将以第二条光纤的退出值完成(无论成功或失败)。 import zi
我有以下 ZIO 程序,其中包含两个永久运行的进程: for { .. numberProvider <- numberProvider(queue).fork //
我试过了 assert(anOption)(contains("x")) 但这仅适用于 Iterables,例如 List 或 Seq。 最佳答案 assert(anOption)(isSome(eq
我有以下功能,我想测试: def people(id: Int): RIO[R, People] 如果有一个人,此函数将返回 id , 分别如果没有,则失败,例如: IO.fail(ServiceEx
我有一个严重的副作用函数(想想数据库调用),我想将其用作惰性值,这样它只会在第一次使用时被调用(如果从未使用过则根本不会被调用)。 我如何使用 ZIO 做到这一点? 如果我的程序看起来像这样,函数只被
我是一名优秀的程序员,十分优秀!