Я пытаюсь написать небольшую библиотеку для API GitHub. И я пытаюсь смоделировать поведение библиотеки Github4s , вот пример этой библиотеки:
val user1 = Github(accessToken).users.get("rafaparadela")
object ProgramEval {
val u1 = user1.exec[Eval, HttpResponse[String]]().value
}
import cats.implicits._
import github4s.GithubResponses.GHResult
ProgramEval.u1 match {
// Here the actual value of the request is returned,
// not the same as Future's onComplete, where the return type is Unit
case Right(GHResult(result, status, headers)) => result.login
case Left(e) => e.getMessage
}
Я цитирую документы:
Каждый вызов API Github4s возвращает GHIO [GHResponse [A]], который является псевдонимом для Free [Github4s, GHResponse [A]].
GHResponse [A], в свою очередь, является псевдонимом типа для Either [GHException, GHResult [A]].
GHResult содержит результат, данный Github, а также код состояния и заголовки ответа:
В какой-то момент они делаютHttpRequest
с использованием HttpClient.scala
Как я мог сам повторить это поведение? Я попытался использовать Cats.Eval, как в примере, но в итоге получился тот же Future[String]
.
Кроме того, у меня возникают некоторые проблемы с вложением, когда я делаю запрос, например, чтобы получить список участников организации, мне нужно сделать два HttpRequest
:
- Один для получения репо организации
- Один для каждого репо, чтобы получить список участников
Этот результат на Future[List[Future[Users]]]
, и я сталкиваюсь с той же проблемой, что и выше,чтобы получить результаты, мне нужно сделать:
(result:Future[List[Future[Users]]]) onComplete { users =>
users.foreach {
_ onComplete {
// Process result
}
}
}
Но я бы хотел вернуть значение, как github4s
. Я читал про Аппликативные и проходимые функторы кошек без удачи.