Migrating from Akka Http to Http4s - custom directives

Viewed 128

I'm starting to learn Http4s, at work we may need to migrate Rest APIs implemented with Akka Http to Http4s.

As an example I can define a custom directive like this:

trait CustomDirectives {

  def extractUUID: Directive1[UUID] = {
    path(Segment).flatMap { maybeuuid =>
      Try(UUID.fromString(maybeuuid)) match {
        case Success(result) => provide(result)
        case Failure(_) =>
          complete(StatusCodes.BadRequest, s"Invalid uuid: $maybeuuid")
      }
    }
  }

}

So everytime I want to extract an UUID and validate it I can use this directive. We have other custom directives to make some processing on headers, and many more.

Is there anything similar to akka custom directives but in Http4s?

1 Answers

This is described in Handling Path Parameters section of the documentation

// standard Scala extractor, matching String against UUID
object UUIDVar {
  def unapply(maybeuuid: String): Option[UUID] =
    Try(UUID.fromString(maybeuuid)).toOption
}

val usersService = HttpRoutes.of[IO] {
  // just use extractor in pattern matching
  case GET -> Root / "users" / UUIDVar(uuid) =>
    Ok(useUUIDForSth(uuid))
}

However, personally, I find it easier to describe endpoints with libraries like Tapir or Endpoint4s since their DSL seem more intuitive to me and I am not coupling my code with a particular implementation.

Related