использование Либо для анализа неудачи и успеха

Я пытаюсь объединить запрос на вытягивание Github, используя спрей. API Github будет возвращать разные значения в зависимости от успешно это или нет.

Как мне разобрать это на Either?

Используя следующий импорт:

import akka.actor.ActorSystem
import spray.client.pipelining._
import spray.json._
import scala.concurrent.Future

Их протокол выглядит так:

object GithubWebProtocol extends DefaultJsonProtocol {
  case class MergeSuccess(message:String, merged:Boolean, sha:String)
  case class MergeFailure(message:String, documentation_url:String)
  implicit val mergeSuccessFormat = jsonFormat3(MergeSuccess)
  implicit val mergeFailureFormat = jsonFormat2(MergeFailure)
}

Тогда, если у меня есть приложение, которое выглядит так:

object GithubWebAPITester extends App {
  implicit val system = ActorSystem()
  import system.dispatcher
  import GithubWebProtocol._

  val api = "https://api.github.com/v3"

  case class PullRequest(org:String, proj:String, pr:Int)

  val mergePullRequest:PullRequest => Future[Either[MergeFailure, MergeSuccess]] = pr => {
    val req = Post(s"$api/repos/${pr.org}/${pr.proj}/pulls/${pr.pr}/merge")
    val pipeline = addHeader("Authorization", s"token ${sys.env("GITHUB_TOKEN")}") ~>
      sendReceive ~>
      unmarshal[Either[MergeFailure, MergeSuccess]]
    pipeline(req)
  }

  mergePullRequest(PullRequest("dvmlls", "slakka-bot", 15)).onComplete {
    case a:Any =>
      println(a)
      system.terminate()
      sys.exit()
  }
}

Я получаю следующую ошибку компиляции:

[error] ./src/main/scala/GithubWebAPI.scala:27: could not find implicit value for evidence parameter of type spray.httpx.unmarshalling.FromResponseUnmarshaller[Either[GithubWebProtocol.MergeFailure,GithubWebProtocol.MergeSuccess]]
[error]       unmarshal[Either[MergeFailure, MergeSuccess]]
[error]                ^

Каков правильный способ сделать это?


person dvmlls    schedule 04.02.2016    source источник


Ответы (1)


Решил это, было две проблемы:

  1. IntelliJ ошибочно предлагал удалить следующую обязательную строку:

import spray.httpx.SprayJsonSupport._

  1. Необходимо добавить rootEitherFormat в соответствии с этим комментарием: https://stackoverflow.com/a/25417819/908042

Сочетание этих двух вещей убивало меня.

Рабочий код здесь: https://github.com/dvmlls/slakka-bot/commit/b7aacdf506c36eb5244d6f1bdd1a707c47aaf5c2

person dvmlls    schedule 04.02.2016