akka-http自定义PathMatcher

时间:2017-03-27 02:23:24

标签: scala akka-http

许多指令(例如parameters)提供了非常方便的解组机制。

但是我没有从文档中找到Path Matcher的类似DSL。 我认为如果给予合适的Unmarshaller,我会像下面的那样,

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

特别是当自定义解组结果为Enumeration时。

他们是否提供了这样的方式,但我找不到或有其他办法做同样的事情?

2 个答案:

答案 0 :(得分:4)

您可以将flatMap分段转换为UserStatus,如下所示:

    Segment.flatMap(UserStatus.fromString)

fromString应该返回Option[UserStatus]

答案 1 :(得分:2)

隐含地延长PathMatcher1[String]要求String => Option[T]的内容。

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]