将 Spray Deserializer 转换为 Akka-Http Unarshaller

Converting a Spray Deserializer to an Akka-Http Unarshaller

我有以下来自 Spray 项目的 Deserializer,我想将其移植到 Akka-Http。我刚开始使用 Akka-Http,所以我不确定如何移植此代码:

  class urlParameterEnumDeserializer[T](enum: AppEnum[T]) extends Deserializer[String, T] {
    def apply(s: String) = {
      enum.valueOf(s).toRight(MalformedContent(s"Expected a valid string for ${enum} conversion. Found: ${s}"))
    }
  }

它曾经允许我将传入的 url 参数转换为我的应用程序的枚举类型,例如,这是一个利用反序列化器的隐式函数:

implicit val contentSourceDeserializer = new urlParameterEnumDeserializer[ContentSource](ContentSource)

我如何在 Akka-Http 中完成同样的事情?

想通了。 Akka 有一些像 FromStringUnmarshaller 这样的预装编组器可以提供帮助。下面是我如何将枚举解串器转换为 Akka-Http UnMarshaller:

  class urlParameterCrowdscriberEnumDeserializer[T](enum: CrowdscriberEnum[T]) extends FromStringUnmarshaller[T] {
    override def apply(s: String)(implicit ec: ExecutionContext, materializer: Materializer): Future[T] = {
      enum.valueOf(s) match {
        case Some(e) => FastFuture.successful(e)
        case None => FastFuture.failed(new IllegalArgumentException(s"Expected a valid string for ${enum} conversion. Found: ${s}"))
      }
    }
  }