Пытаясь научиться пользоваться библиотекой ZIO, я решил создать базовое приложение веб-службы. Идея довольно проста, используйте http4s lib для конечных точек сервера и маршрута, выведите «hello world» при вызове конечной точки.
С помощью документов и примеров, которые я нашел, создает код:
object Main extends ManagedApp {
type AppEnvironment = Clock with Console with HelloRepository
type AppTask[A] = RIO[AppEnvironment, A]
override def run(args: List[String]): ZManaged[ZEnv, Nothing, Int] = {
val httpApp: HttpApp[AppTask] = Router[AppTask]("/" -> helloWorldService).orNotFound
val server = ZIO.runtime[AppEnvironment].flatMap { implicit rts =>
BlazeServerBuilder[AppTask]
.bindHttp(8080, "0.0.0.0")
.withHttpApp(CORS(httpApp))
.serve
.compile[AppTask, AppTask, ExitCode]
.drain
}
(for {
_ <- ZManaged.environment[ZEnv] >>> server.toManaged_
} yield ())
.foldM(err => putStrLn(s"Execution failed with: $err").as(1).toManaged_, _ => ZManaged.succeed(0))
}
val dsl: Http4sDsl[AppTask] = Http4sDsl[AppTask]
import dsl._
val helloWorldService: HttpRoutes[AppTask] = HttpRoutes.of[AppTask] {
case GET -> Root / "hello" / name => Ok(Repo.getHello(name))
}
}
trait HelloRepository extends Serializable {
val helloRepository: HelloRepository.Service[Any]
}
object HelloRepository extends Serializable {
trait Service[R] extends Serializable {
def getHello(name: String): ZIO[R, Nothing, String]
}
}
object Repo extends HelloRepository.Service[HelloRepository] {
override def getHello(name: String): ZIO[HelloRepository, Nothing, String] = ZIO.succeed(s"Hello $name")
}
- Создаю роутер:
Router[AppTask]("/" ...
- Создаю сервер:
ZIO.runtime[AppEnvironment].flatMap ...
- Затем пытаюсь запустить сервер со средой ZIO, но что-то мне не хватает, так как эта строка:
_ <- ZManaged.environment[ZEnv] >>> server.toManaged_
исправлена и выдает ошибку при сборке: Ошибка: (34, 39) аргументы предполагаемого типа [touch.Main.AppEnvironment, Throwable, Unit] do не соответствуют границам параметра типа метода >>> [R1>: zio.ZEnv, E1, B] _ ‹- ZManaged.environment [ZEnv] >>> server.toManaged_
Error:(34, 39) inferred type arguments [touch.Main.AppEnvironment,Throwable,Unit] do not conform to method >>>'s type parameter bounds [R1 >: zio.ZEnv,E1,B]
Error:(34, 50) type mismatch;
found : zio.ZManaged[touch.Main.AppEnvironment,Throwable,Unit]
(which expands to) zio.ZManaged[zio.clock.Clock with zio.console.Console with touch.HelloRepository,Throwable,Unit]
required: zio.ZManaged[R1,E1,B]
может кто мне поможет с правильным синтаксисом? также хотел бы получить некоторые объяснения или ссылку на документы, где это объясняется.