private def responseValidationFlow[T](responsePair: ResponsePair)(implicit evidence: FromByteStringUnmarshaller[T]) = responsePair match {
case (Success(response), _) => {
response.entity.dataBytes
.via(Framing.delimiter(ByteString("\n"), maximumFrameLength = 8192))
.mapAsyncUnordered(Runtime.getRuntime.availableProcessors()) { body =>
if (response.status == OK) {
val obj: Future[T] = Unmarshal(body).to[T]
obj.foreach(x => log.debug("Received {}: {}.", x.getClass.getSimpleName, x))
obj.map(Right(_))
} else {
val reason = body.utf8String
log.error("Non 200 response status: {}, body: {}.", response.status.intValue(), reason)
Future.successful(reason)
.map(Left(_))
}
}
}
case (Failure(t), _) => {
Source.single(Left(t.getMessage))
}
}
Was ich tun möchte, ist beide Seiten der Either
zu parametrisieren. Das ist nicht schwer zu tun, aber was ich habe Probleme mit der Erstellung einer Left
oder Right
, die keinen Wert hat. In diesem Fall sollte der Körper vollständig verzehrt und entsorgt werden. Ich versuchte mit ClassTag
s, aber der Compiler denkt, dass der Typ Any
ist, nicht S
oder T
. Eine Probe Aufruf dieses Verfahren würde wie responseValidationFlow[String, Unit]
aussieht eine Herstellung Source[Either[String, Unit]]
Wie erstellt man entweder [S, T] wo S oder T Einheit sein könnte?
Ist das nicht eine 'Option [String]' –
@RamonJRomeroyVigil Nur wenn einer der Typen 'Unit' ist. Ein anderes Mal könnte es sein: Entweder [String, Was auch immer] ' –