Элегантная обработка ошибок с помощью клиента Scala sttp
Я использую клиент scala sttp и, в частности, использую бэкэнд Monix, и у меня есть следующий код:
def httpTask(href: String): Task[HttpBinaryResponse] = {
val request = basicRequest
.get(uri"$href")
AsyncHttpClientMonixBackend
.resource()
.use { backend =>
request.send(backend).map {
response: Response[Either[String, String]] =>
println(s"For URL: $href >> Got response code: ${response.code}")
HttpBinaryResponse(
href,
response.code.isSuccess,
response.headers.map(elem => (elem.name, elem.value)))
}
}
}
У меня есть набор URL-адресов, которые я использую этим методом:
hrefs.toSet.flatten.filter(_.startsWith("http")).map(httpTask) // Set[Task[HttpBinaryResponse]]
Затем в своей функции вызывающего я выполняю задачу:
val taskSeq = appBindings.httpService.parse(parserFilter)
val chunks = taskSeq.sliding(30, 30).toSeq
val batchedTasks = chunks.map(chunk => Task.parSequence(chunk))
val allBatches = Task.sequence(batchedTasks).map(_.flatten)
Затем я сопоставляю шаблон для материализованного типа и возвращаюсь, но я хочу, чтобы здесь были не только успех и неудача, но я хотел бы иметь оба значения одновременно:
allBatches.runToFuture.materialize.map {
case Success(elem) =>
Ok(
Json
.obj("status" -> "Ok", "URL size" -> s"${elem.size}")
).enableCors
case Failure(err) =>
Ok(
Json
.obj("status" -> "error", "message" -> s"${err.getMessage}")
).enableCors
}
Мне нужно получить список URL-адресов с соответствующим сообщением об успехе или ошибке. При таком подходе из того, что у меня есть, я получаю только один из них, что очевидно, поскольку я сопоставил с образцом. Как я могу собрать как успехи, так и неудачи?