我有一个使用Softwaremill sttp客户端发出HTTP请求的功能。我还将Cats库用于leftMap功能。这是函数:
def tags(repositoryName: String): Either[String, List[Tag]] = {
val uri = uri"$gitLabBaseUrl/api/v4/projects/$repositoryName/repository/tags"
val request = sttp.get(uri).header("PRIVATE-TOKEN", privateToken).response(asJson[List[Tag]])
request
.send()
.body
.flatMap(
_.leftMap(
e => Left(e.message)
)
)
.leftMap(_.toString)
}
因此,如您所见,我希望函数的签名为Either [String,List [Tag]]。但是,要实现这一点,我需要执行两个leftMap语句,在我的推理中,仅第一个leftMap应该就足够了。我将语句分解以获得类型签名:
val foo: Id[Response[Either[DeserializationError[circe.Error], List[Tag]]]] = request.send()
val foo2: Either[String, Either[DeserializationError[circe.Error], List[Tag]]] = request.send().body
val foo3: Either[io.Serializable, List[Tag]] = request.send().body.flatMap(_.leftMap(e => Left(e.message)))
并且您可以看到flatMap返回的Either的类型为[io.Serializable,List [Tag]]。但是,request.send()。body的签名是:
Either[String, Either[DeserializationError[circe.Error], List[Tag]]]
因此,e.message导致一个字符串,因此我期望
_.leftMap(e => Left(e.message))
声明已经导致
Either[String, List[Tag]]
但是它具有签名
Either[io.Serializable, List[Tag]]
所以我需要做第二个leftMap以获得正确的签名
Either[String, List[Tag]]
有人可以帮助我如何避免不得不做第二个leftMap吗?似乎没有必要,但我无法弄清楚如何解决它。
谢谢!
答案 0 :(得分:1)
尝试
request
.send()
.body
.flatMap { _.left.map(_.message) }