dave
04/06/2018, 7:30 PMCatchLensFailure
to create a custom response. New method looks like this: ServerFilters.CatchLensFailure { lensFailure -> Response(OK).body(lensFailure.localizedMessage) }
. Releasing in 3.23.0elifarley
04/13/2018, 3:16 AMelifarley
04/13/2018, 3:17 AMelifarley
04/13/2018, 3:18 AMelifarley
04/13/2018, 3:19 AMdave
04/14/2018, 10:14 AMdave
04/14/2018, 10:16 AMelifarley
04/14/2018, 10:55 AMelifarley
04/14/2018, 10:57 AMelifarley
04/14/2018, 10:58 AMdave
04/14/2018, 10:59 AMdave
04/14/2018, 10:59 AMelifarley
04/14/2018, 10:59 AMdave
04/14/2018, 11:00 AMelifarley
04/14/2018, 11:00 AMelifarley
04/14/2018, 11:01 AMdave
04/14/2018, 11:01 AMdave
04/14/2018, 11:02 AMQuery.zonedDateTime().required("foo")(Request(GET, "/?foo=asd"))
dave
04/14/2018, 11:02 AMException in thread "main" org.http4k.lens.LensFailure: query 'foo' must be string
at org.http4k.lens.Lens.invoke(lens.kt:17)
at org.http4k.testing.LensKt.main(lens.kt:11)
Caused by: java.time.format.DateTimeParseException: Text 'asd' could not be parsed at index 0
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at org.http4k.lens.LensSpecKt$zonedDateTime$1.invoke(lensSpec.kt:209)
at org.http4k.lens.LensSpecKt$zonedDateTime$1.invoke(lensSpec.kt)
at org.http4k.lens.LensGet$map$1.invoke(lensSpec.kt:227)
at org.http4k.lens.LensGet$map$1.invoke(lensSpec.kt:16)
at org.http4k.lens.LensGet$invoke$1.invoke(lensSpec.kt:17)
at org.http4k.lens.LensGet$invoke$1.invoke(lensSpec.kt:16)
at org.http4k.lens.BiDiLensSpec$required$1.invoke(lensSpec.kt:164)
at org.http4k.lens.Lens.invoke(lens.kt:13)
... 1 more
elifarley
04/14/2018, 11:02 AMdave
04/14/2018, 11:02 AMdave
04/14/2018, 11:05 AMelifarley
04/14/2018, 11:05 AMdave
04/14/2018, 11:06 AMoverride fun invoke(nextHandler: HttpHandler): HttpHandler =
{ req ->
val body = routeMeta.body?.let { listOf(it::invoke) } ?: emptyList<(Request) -> Any?>()
val errors = body.plus(routeMeta.requestParams).fold(emptyList<Failure>()) { memo, next ->
try {
next(req)
memo
} catch (e: LensFailure) {
memo.plus(e.failures)
}
}
if (errors.isEmpty()) nextHandler(req) else throw LensFailure(errors)
}
dave
04/14/2018, 11:06 AMelifarley
04/14/2018, 11:06 AMelifarley
04/14/2018, 11:06 AMelifarley
04/14/2018, 11:06 AMelifarley
04/14/2018, 11:06 AMelifarley
04/14/2018, 11:08 AMelifarley
04/14/2018, 11:08 AMdave
04/14/2018, 11:09 AMelifarley
04/14/2018, 11:09 AMelifarley
04/14/2018, 11:09 AMelifarley
04/14/2018, 11:11 AMdave
04/14/2018, 11:11 AMResponse(BAD_REQUEST.description(it.failures.joinToString("; "))
elifarley
04/14/2018, 11:12 AMdave
04/14/2018, 11:12 AMelifarley
04/14/2018, 11:13 AMdave
04/14/2018, 11:13 AMContractRouteSpec
elifarley
04/14/2018, 11:13 AMdave
04/14/2018, 11:13 AMelifarley
04/14/2018, 11:16 AMdave
04/14/2018, 11:19 AMabstract class ContractRouteSpec internal constructor(val pathFn: (PathSegments) -> PathSegments,
val routeMeta: RouteMeta,
vararg val pathLenses: PathLens<*>) : Filter {
abstract fun with(new: RouteMeta): ContractRouteSpec
abstract infix operator fun <T> div(next: PathLens<T>): ContractRouteSpec
open infix operator fun div(next: String) = div(Path.fixed(next))
override fun invoke(nextHandler: HttpHandler): HttpHandler =
{ req ->
val body = routeMeta.body?.let { listOf(it::invoke) } ?: emptyList<(Request) -> Any?>()
val overall = body.plus(routeMeta.requestParams).fold(null as LensFailure?) { memo, next ->
try {
next(req)
memo
} catch (e: LensFailure) {
memo?.let { LensFailure(it.failures + e.failures, e) } ?: e
}
}
overall?.let { throw it } ?: nextHandler(req)
}
internal fun describe(contractRoot: PathSegments): String = "${pathFn(contractRoot)}${if (pathLenses.isNotEmpty()) "/${pathLenses.joinToString("/")}" else ""}"
}
dave
04/14/2018, 11:22 AMelifarley
04/14/2018, 11:22 AMdave
04/14/2018, 11:23 AMdave
04/14/2018, 11:24 AMelifarley
04/14/2018, 11:24 AMdave
04/14/2018, 11:25 AMdave
04/14/2018, 11:25 AMelifarley
04/14/2018, 11:25 AMdave
04/14/2018, 11:26 AMelifarley
04/14/2018, 11:26 AMdave
04/15/2018, 11:09 AMdave
04/15/2018, 11:21 AM