Как правильно использовать либо с IO?

#scala #functional-programming #akka-http #scala-cats

#scala #функциональное программирование #akka-http #scala-кошки

Вопрос:

У меня есть AkkaHttp клиент и cats библиотека. Я хотел бы избежать исключения, поэтому я написал этот код:

 class AkkaHttpJokeClient(url: String)(implicit system: ActorSystem) extends JokeClient[IO] {
  override def getJoke(): IO[Either[Throwable, Joke]] = {
    implicit val materializer: ActorMaterializer = ActorMaterializer()
    implicit val ec: ExecutionContext = system.dispatcher

    IO.fromFuture(IO {
      Http()
        .singleRequest(HttpRequest(uri = url))
        .flatMap(Unmarshal(_).to[String])
        .map(x => Try{x.parseJson.convertTo[Joke]}.toEither)
      })
  }
}
  

Это работает, но у меня есть несколько проблем с этим. Первая проблема — проблема подключения не решена. Второе: я думаю, это можно было бы сделать проще, не так ли? Я не могу найти правильные методы, чтобы сделать это лучше.

Комментарии:

1. «Первая проблема — проблема подключения не решена». В чем проблема, которая не решена?

2. Например, проблема с таймаутом соединения.

3. Что вы подразумеваете под «правильно»? Например, возврат IO[Joke] из getJoke() и не вложенный либо с еще одним каналом ошибок?