使用 Either 解析失败和成功
using Either to parse failure and success
我正在尝试使用 spray 合并 Github 拉取请求。 Github's API 将根据成功或失败 return 不同的值。
如何将其解析为 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] ^
正确的做法是什么?
解决了这个问题,有两个问题:
- IntelliJ 错误地建议我删除以下行,这是必需的:
import spray.httpx.SprayJsonSupport._
- 需要根据此评论添加
rootEitherFormat
:
这两个人的结合简直要了我的命。
工作代码在这里:https://github.com/dvmlls/slakka-bot/commit/b7aacdf506c36eb5244d6f1bdd1a707c47aaf5c2
我正在尝试使用 spray 合并 Github 拉取请求。 Github's API 将根据成功或失败 return 不同的值。
如何将其解析为 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] ^
正确的做法是什么?
解决了这个问题,有两个问题:
- IntelliJ 错误地建议我删除以下行,这是必需的:
import spray.httpx.SprayJsonSupport._
- 需要根据此评论添加
rootEitherFormat
:
这两个人的结合简直要了我的命。
工作代码在这里:https://github.com/dvmlls/slakka-bot/commit/b7aacdf506c36eb5244d6f1bdd1a707c47aaf5c2