В типичном стиле Akka Http DSL мы имеем:
import akka.http.scaladsl.server.Directives._
тогда далее в коде вы можете увидеть что-то вроде
val routes = {
logRequestResult("akka-http-microservice") {
pathPrefix("ip") {
(get & path(Segment)) { ip =>
complete {
fetchIpInfo(ip).map[ToResponseMarshallable] {
case Right(ipInfo) => ipInfo
case Left(errorMessage) => BadRequest -> errorMessage
}
}
} ~
(post & entity(as[IpPairSummaryRequest])) { ipPairSummaryRequest =>
complete {
val ip1InfoFuture = fetchIpInfo(ipPairSummaryRequest.ip1)
val ip2InfoFuture = fetchIpInfo(ipPairSummaryRequest.ip2)
ip1InfoFuture.zip(ip2InfoFuture).map[ToResponseMarshallable] {
case (Right(info1), Right(info2)) => IpPairSummary(info1, info2)
case (Left(errorMessage), _) => BadRequest -> errorMessage
case (_, Left(errorMessage)) => BadRequest -> errorMessage
}
}
}
}
}
Что я не понимаю полностью, так это как, например, 'get' в (get & path(Segment)) { ip =>
распознается как метод def из черты MethodDirectives. Итак, мы набираем '(get ...', и Scala знает, что это из MethodDirectives, но как?
Мне кажется, что то, что делает эту работу, является основной особенностью компилятора Scala, которая не очевидна для меня.
Я всегда говорю, что людям, переходящим с Java на Scala, все равно, что переходить в новую религию, иногда нужно просто верить;)
Я знаю, что пну себя, когда узнаю: (