许多指令(例如parameters)提供了非常方便的解组机制。
但是我没有从文档中找到Path Matcher的类似DSL。 我认为如果给予合适的Unmarshaller,我会像下面的那样,
implicit val userStatusUnmarshaller: FromStringUnmarshaller[UserStatus] = ???
val route = path("user" / Segment.as[UserStatus]) { status: UserStatus =>
...
}
特别是当自定义解组结果为Enumeration时。
他们是否提供了这样的方式,但我找不到或有其他办法做同样的事情?
答案 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]
。