2017-03-27 16 views
0

ディレクティブの多く(例:parameters)は、非常に便利なアンマーシャリングメカニズムを提供します。akka-httpカスタムPathMatcher

しかし、私はドキュメントからPath Matcherの類似したDSLを見つけることに失敗しました。 カスタムマーシャリング解除結果が列挙されたとき、私はexpecially

implicit val userStatusUnmarshaller: FromStringUnmarshaller[UserStatus] = ??? 
val route = path("user"/Segment.as[UserStatus]) { status: UserStatus => 
    ... 
} 

、適切なUnmarshallerの与えられた、私は以下のようなものをと思いました。

彼らはこのような方法を提供しますが、私は見つけることができなかったか、同じことをする別の方法がありますか?

答えて

2

が何についての暗黙のうちに何かString => Option[T]を求めPathMatcher1[String]を延長返す必要があります。例えば

implicit class PimpedSegment(segment: PathMatcher1[String]) { 
    def as[T](implicit asT: String => Option[T]): PathMatcher1[T] = 
    segment.flatMap(asT) 
} 

あなたは暗黙的にJsonReader[T]を必要とする可能性がある:

implicit class JsonSegment(segment: PathMatcher1[String]) { 
    def as[T: JsonReader]: PathMatcher1[T] = segment.flatMap { string => 
    Try(JsString(string).convertTo[T]).toOption 
    } 
} 

そして、それはSegment.as[UserStatus]として使用することができます。

4

あなたはそうのようなUSERSTATUSにセグメントをflatMapことができます。

Segment.flatMap(UserStatus.fromString) 

fromStringOption[UserStatus]