<@UG2RK4C10> Not sure exactly if this fits your pl...
# http4k
d
@Tom Ellis Not sure exactly if this fits your plan, but maybe something like this?
Copy code
import org.http4k.contract.ContractRoute
import org.http4k.contract.bindContract
import org.http4k.contract.contract
import org.http4k.core.Body
import org.http4k.core.HttpHandler
import org.http4k.core.Method
import org.http4k.core.Response
import org.http4k.core.Status
import org.http4k.core.Uri
import org.http4k.core.then
import org.http4k.core.with
import org.http4k.filter.ClientFilters
import org.http4k.filter.DebuggingFilters
import org.http4k.format.Jackson.auto

inline operator fun <reified IN : Any, reified OUT : Any> HttpHandler.invoke(route: ContractRoute, baseUrl: String, requestBody: IN): OUT {
    val requestLens = Body.auto<IN>().toLens()
    val responselens = Body.auto<OUT>().toLens()

    return responselens(
        invoke(route.newRequest(Uri.of(baseUrl)).with(requestLens of requestBody))
    )
}

data class Hello(val value: String)

fun main() {

    val route = "/echo" bindContract <http://Method.POST|Method.POST> to {
        Response(Status.OK).body(it.body)
    }

    val contract = contract {
        routes += route
    }

    val app = DebuggingFilters.PrintRequestAndResponse()
        .then(ClientFilters.BearerAuth("sometoken"))
        .then(contract)

    val out: Hello = app(route, "<http://localhost:9000>", Hello("there"))

    println(out)
}