我有一个如下所示的 API:
object Comics {
...
def impl[F[_]: Applicative]: Comics[F] = new Comics[F] {
def getAuthor(slug: Authors.Slug): F[Option[Authors.Author]] =
...
和一个看起来像这样的路由:
object Routes {
def comicsRoutes[F[_]: Sync](comics: Comics[F]): HttpRoutes[F] = {
val dsl = new Http4sDsl[F] {}
import dsl._
HttpRoutes.of[F] {
case GET -> Root / "comics" / authorSlug =>
comics
.getAuthor(Authors.Slug(authorSlug))
.flatMap {
case Some(author) => Ok(author)
case None => NotFound()
}
因此,当有 时None
,它会转换为 404。由于有多个路由,因此.flatMap { ... }
会重复。
问题:如何将其移动到.orNotFound
特定于我的项目的单独帮助函数中?
我的尝试:
为了让我的事情变得简单(并避免F
最初的参数化),我试图在里面定义这个comicsRoutes
:
def comicsRoutes[F[_]: Sync](comics: Comics[F]): HttpRoutes[F] = {
val dsl = new Http4sDsl[F] {}
import dsl._
def orNotFound[A](opt: Option[A]): ???[A] =
opt match {
case Some(value) => Ok(value)
case None => NotFound()
}
HttpRoutes.of[F] {
case GET -> Root / "comics" / authorSlug =>
comics
.getAuthor(Authors.Slug(authorSlug))
.flatMap(orNotFound)
但是???
这里有什么?似乎不是Response
或Status
。此外,它.flatMap { ... }
是在 下制作的import dsl._
,但我想把它移到更远的地方。什么是好地方?它是进入路由文件,还是我把它放在一个单独的ExtendedSomething
扩展文件中?(我希望这可能是相关的???
,Something
但我对缺少的类型有点困惑。)
(同样重要的是,我如何找出???
这里有什么?我希望???
在类型级别可以给我一个“类型漏洞”,而 VSCode 的悬停功能提供了非常零星的文档价值。)