Как зарезервировать ответ ZIO внутри пользовательского метода в

у меня есть этот метод

      
import ClientServer.*
import zio.http.{Client, *}
import zio.json.*
import zio.http.model.Method
import zio.{ExitCode, URIO, ZIO}
import sttp.capabilities.*
import sttp.client3.Request
import zio.*
import zio.http.model.Headers.Header
import zio.http.model.Version.Http_1_0
import zio.stream.*
import java.net.InetAddress
import sttp.model.sse.ServerSentEvent
import sttp.client3._



object fillFileWithLeagues:

  def fill = for {
    openDotaResponse <- Client.request("https://api.opendota.com/api/leagues")
    bodyOfResponse <- openDotaResponse.body.asString
    listOfLeagues <- ZIO.fromEither(bodyOfResponse.fromJson[List[League]].left.map(error => new Exception(error)))
    save = FileStorage.saveToFile(listOfLeagues.toJson) //Ok
    }yield ()
    println("Im here fillFileWithLeagues.fill ")

и когда я пытаюсь использовать


Ничего не произошло

Я пытаюсь заполнить файл данными из целевого API, используя

      fillFileWithLeagues.fill
      def readFromFileV8(path: Path = Path("src", "main", "resources", "data.json")): ZIO[Any, Throwable, String] =
  val zioStr = (for bool <- Files.isReadable(path) yield bool).flatMap(bool =>
  if (bool) Files.readAllLines(path, Charset.Standard.utf8).map(_.head)
  else {
    fillFileWithLeagues.fill
    wait(10000)
    println("im here readFromFileV8")
    readFromFileV8()})
  zioStr

Я ожидаю, что файл data.json должен быть создан из

      Client.request("https://api.opendota.com/api/leagues")

но ничего не происходит

Может быть, мне следует использовать какой-нибудь sttp или какие-то другие инструменты?

1 ответ

Если мы исправим отступ кода, мы найдем это:

      object fillFileWithLeagues {

  def fill = {
    for {
      openDotaResponse <- Client.request("https://api.opendota.com/api/leagues")
      bodyOfResponse <- openDotaResponse.body.asString
      listOfLeagues <- ZIO.fromEither(bodyOfResponse.fromJson[List[League]].left.map(error => new Exception(error)))
      save = FileStorage.saveToFile(listOfLeagues.toJson) //Ok
    } yield ()
  }

  println("Im here fillFileWithLeagues.fill ")
}

Как видите, println является частьюfillFileWithLeagues, не изfill.

Другая потенциальная проблема заключается в том, что такое выражение, какfillFileWithLeagues.fillвозвращает только экземпляр ZIO, он еще не оценен. Чтобы оценить его, его нужно запустить. Например, следующим образом:

      import zio._

object MainApp extends ZIOAppDefault {
  def run = fillFileWithLeagues.fill
}
Другие вопросы по тегам