Skip to main content

kebs-akka-http / kebs-pekko-http

Automatic unmarshallers and path matchers for Akka HTTP and Pekko HTTP.

Setup

// Akka HTTP (Scala 2 only)
libraryDependencies += "pl.iterators" %% "kebs-akka-http" % kebsVersion

// Pekko HTTP (Scala 2 & 3)
libraryDependencies += "pl.iterators" %% "kebs-pekko-http" % kebsVersion

Unmarshallers

Provides automatic FromStringUnmarshaller for value classes, enums, and instance types in parameters, formFields, and entity directives:

import pl.iterators.kebs.pekkohttp.unmarshallers.KebsPekkoHttpUnmarshallers
import pl.iterators.kebs.enumeratum.{KebsEnumeratum, KebsValueEnumeratum}
import pl.iterators.kebs.core.macros.CaseClass1ToValueClass
import pl.iterators.kebs.instances.net.URIString
import pl.iterators.kebs.instances.time.mixins.InstantEpochMilliLong

// For Scala 3 native enums, use instead:
// import pl.iterators.kebs.enums.{KebsEnum, KebsValueEnum}

case class Offset(value: Int) extends AnyVal
case class Limit(value: Int) extends AnyVal

val route = get {
parameters("sortBy".as[Column], "order".as[SortOrder], "offset".as[Offset], "limit".as[Limit]) {
(sortBy, order, offset, limit) => // ...
}
}

// Also works with formFields:
val formRoute = post {
formFields("yearMonth".as[YearMonth]) { yearMonth => // ... }
}

For Akka HTTP, use KebsAkkaHttpUnmarshallers instead:

import pl.iterators.kebs.akkahttp.unmarshallers.KebsAkkaHttpUnmarshallers

Path matchers

A separate matchers package provides typed path segment extraction via extension methods on PathMatcher1:

import pl.iterators.kebs.pekkohttp.matchers.KebsPekkoHttpMatchers
// or: import pl.iterators.kebs.pekkohttp.matchers._

// For Akka HTTP:
// import pl.iterators.kebs.akkahttp.matchers.KebsAkkaHttpMatchers

.as[T] — value class wrapping

Converts a path segment via ValueClassLike:

path("user" / LongNumber.as[UserId])          // Long → UserId
path("item" / JavaUUID.as[ItemId]) // UUID → ItemId
path("name" / Segment.as[Name]) // String → Name

.to[T] — instance conversion

Converts a path segment via InstanceConverter:

path("date" / Segment.to[ZonedDateTime])       // String → ZonedDateTime
path("day" / IntNumber.to[DayOfWeek]) // Int → DayOfWeek
path("ts" / LongNumber.to[Instant]) // Long → Instant (with InstantEpochMilliLong)

.asEnum[T] — enum by name

Converts a string segment via EnumLike (case-insensitive):

path("greeting" / Segment.asEnum[Greeting])    // "hello" → Greeting.Hello

.asValueEnum[T] — value enum by value

Converts a segment via ValueEnumLike:

path("item" / IntNumber.asValueEnum[LibraryItem])  // 1 → LibraryItem.Book

Chaining

Matchers can be chained — first convert, then wrap:

path("uri" / Segment.to[URI].as[TaggedUri])    // String → URI → TaggedUri