HttpPredicate.kt
package com.hexagontk.http.handlers
import com.hexagontk.handlers.Context
import com.hexagontk.http.patterns.LiteralPathPattern
import com.hexagontk.http.model.HttpMethod
import com.hexagontk.http.patterns.PathPattern
import com.hexagontk.http.patterns.createPathPattern
import com.hexagontk.http.model.HttpCall
class HttpPredicate(
val methods: Set<HttpMethod> = emptySet(),
val pathPattern: PathPattern = LiteralPathPattern(),
val status: Int? = null,
) : (Context<HttpCall>) -> Boolean {
private fun PathPattern.isEmpty(): Boolean =
pattern.isEmpty()
val predicate: (Context<HttpCall>) -> Boolean =
if (methods.isEmpty()) ::filterWithoutMethod else ::filterWithMethod
constructor(
methods: Set<HttpMethod> = emptySet(),
pattern: String = "",
status: Int? = null,
prefix: Boolean = false,
) :
this(methods, createPathPattern(pattern, prefix), status)
override fun invoke(context: Context<HttpCall>): Boolean =
predicate(context)
fun clearMethods(): HttpPredicate =
HttpPredicate(emptySet(), pathPattern, status)
private fun filterMethod(context: Context<HttpCall>): Boolean =
context.event.request.method in methods
private fun filterPattern(context: Context<HttpCall>): Boolean =
if (pathPattern.isEmpty() && context.event.request.path == "/") true
else pathPattern.matches(context.event.request.path)
private fun filterStatus(context: Context<HttpCall>): Boolean =
status == context.event.response.status
private fun filterWithoutMethod(context: Context<HttpCall>): Boolean =
filterPattern(context)
&& (status == null || filterStatus(context))
private fun filterWithMethod(context: Context<HttpCall>): Boolean =
filterMethod(context) && filterWithoutMethod(context)
fun addPrefix(prefix: String): HttpPredicate =
HttpPredicate(methods, pathPattern.addPrefix(prefix), status)
fun describe(): String =
methods
.map { it.name }
.ifEmpty { listOf("ANY") }
.joinToString(
separator = ", ",
postfix = pathPattern.describe().prependIndent(" "),
transform = { it }
)
}