У меня есть функция, которая делает HTTP-запрос с помощью клиента Softwaremill STTP.Я также использую библиотеку 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)))
И, как вы можете видеть, Either, возвращаемый flatMap, имеет тип [io.Serializable, List [Tag]].Однако подпись для request.send (). Body:
Either[String, Either[DeserializationError[circe.Error], List[Tag]]]
, поэтому e.message приводит к String, и поэтому я ожидал, что оператор
_.leftMap(e => Left(e.message))
уже приводит к
Either[String, List[Tag]]
Но вместо этого он имеет в качестве подписи
Either[io.Serializable, List[Tag]]
Так что мне нужно сделать второй leftMap, чтобы получить правильную подпись
Either[String, List[Tag]]
Может кто-нибудь помочь мне, как мне избежать необходимости делать вторую левую карту?Кажется, что в этом нет необходимости, но я не смог понять, как ее решить.
Спасибо!