org.http4k.contract.routeSpec.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of http4k-contract Show documentation
Show all versions of http4k-contract Show documentation
http4k typesafe HTTP contracts and OpenApi support
package org.http4k.contract
import org.http4k.core.HttpHandler
import org.http4k.core.Method
import org.http4k.core.Request
import org.http4k.core.Uri
import org.http4k.lens.Path
import org.http4k.lens.PathLens
abstract class ContractRouteSpec internal constructor(
val pathFn: (PathSegments) -> PathSegments,
val routeMeta: RouteMeta,
vararg val pathLenses: PathLens<*>
) {
abstract infix operator fun div(next: PathLens): ContractRouteSpec
open infix operator fun div(next: String) = div(Path.fixed(next))
internal fun describe(contractRoot: PathSegments) = "${pathFn(contractRoot)}${if (pathLenses.isNotEmpty()) "/${pathLenses.joinToString("/")}" else ""}"
open inner class ContractRequestBuilder(internal val method: Method) {
fun newRequest(baseUri: Uri = Uri.of("")) = Request(method, "").uri(baseUri.path(describe(Root)))
}
abstract infix fun bindContract(method: Method): ContractRequestBuilder
}
class ContractRouteSpec0 internal constructor(pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta) : ContractRouteSpec(pathFn, routeMeta) {
override infix operator fun div(next: String) = ContractRouteSpec0({ it / next }, routeMeta)
override infix operator fun div(next: PathLens) = ContractRouteSpec1(pathFn, routeMeta, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: HttpHandler) = with(this@ContractRouteSpec0) { ContractRoute(method, this, routeMeta) { fn } }
infix fun to(fn: () -> HttpHandler) = with(this@ContractRouteSpec0) { ContractRoute(method, this, routeMeta) { fn() } }
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec1 internal constructor(pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta, val a: PathLens) : ContractRouteSpec(pathFn, routeMeta, a) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec2(pathFn, routeMeta, a, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A) -> HttpHandler) = with(this@ContractRouteSpec1) {
ContractRoute(method, this, routeMeta) { fn(it[a]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec2 internal constructor(pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta, val a: PathLens, val b: PathLens) : ContractRouteSpec(pathFn, routeMeta, a, b) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec3(pathFn, routeMeta, a, b, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B) -> HttpHandler) = with(this@ContractRouteSpec2) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec3 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec4(pathFn, routeMeta, a, b, c, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C) -> HttpHandler) = with(this@ContractRouteSpec3) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec4 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens, val d: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c, d) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec5(pathFn, routeMeta, a, b, c, d, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C, D) -> HttpHandler) = with(this@ContractRouteSpec4) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c], it[d]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec5 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens, val d: PathLens, val e: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c, d, e) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec6(pathFn, routeMeta, a, b, c, d, e, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C, D, E) -> HttpHandler) = with(this@ContractRouteSpec5) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c], it[d], it[e]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec6 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens, val d: PathLens, val e: PathLens, val f: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c, d, e, f) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec7(pathFn, routeMeta, a, b, c, d, e, f, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C, D, E, F) -> HttpHandler) = with(this@ContractRouteSpec6) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c], it[d], it[e], it[f]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec7 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens, val d: PathLens, val e: PathLens,
val f: PathLens, val g: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c, d, e, f, g) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec8(pathFn, routeMeta, a, b, c, d, e, f, g, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C, D, E, F, G) -> HttpHandler) = with(this@ContractRouteSpec7) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c], it[d], it[e], it[f], it[g]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec8 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens, val d: PathLens, val e: PathLens,
val f: PathLens, val g: PathLens, val h: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c, d, e, f, g, h) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec9(pathFn, routeMeta, a, b, c, d, e, f, g, h, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C, D, E, F, G, H) -> HttpHandler) = with(this@ContractRouteSpec8) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c], it[d], it[e], it[f], it[g], it[h]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec9 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens, val d: PathLens, val e: PathLens,
val f: PathLens, val g: PathLens, val h: PathLens, val i: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c, d, e, f, g, h, i) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = ContractRouteSpec10(pathFn, routeMeta, a, b, c, d, e, f, g, h, i, next)
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C, D, E, F, G, H, I) -> HttpHandler): ContractRoute =
with(this@ContractRouteSpec9) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c], it[d], it[e], it[f], it[g], it[h], it[i]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}
class ContractRouteSpec10 internal constructor(
pathFn: (PathSegments) -> PathSegments, routeMeta: RouteMeta,
val a: PathLens, val b: PathLens, val c: PathLens, val d: PathLens, val e: PathLens,
val f: PathLens, val g: PathLens, val h: PathLens, val i: PathLens,
val j: PathLens
) : ContractRouteSpec(pathFn, routeMeta, a, b, c, d, e, f, g, h, i, j) {
override infix operator fun div(next: String) = div(Path.fixed(next))
override infix operator fun div(next: PathLens) = throw UnsupportedOperationException("no longer paths!")
inner class Binder(method: Method) : ContractRequestBuilder(method) {
infix fun to(fn: (A, B, C, D, E, F, G, H, I, J) -> HttpHandler) = with(this@ContractRouteSpec10) {
ContractRoute(method, this, routeMeta) { fn(it[a], it[b], it[c], it[d], it[e], it[f], it[g], it[h], it[i], it[j]) }
}
}
override infix fun bindContract(method: Method) = Binder(method)
}