Oliver Rümpelein
034c00ca5b
- Category - Classification - Design - Layout - Order - Page - Status - Thrill
97 lines
3.4 KiB
Kotlin
97 lines
3.4 KiB
Kotlin
package de.pheerai.rcdbquery.dsl
|
|
|
|
import de.pheerai.rcdbquery.dataMappings.internal.RcdbParamOption
|
|
import de.pheerai.rcdbquery.dataMappings.searchType.SearchType
|
|
|
|
// TODO: Restructure
|
|
|
|
data class RcdbParams(
|
|
val multiParams: MultiParams,
|
|
val singleParams: SingleParams
|
|
) {
|
|
fun toStrings(): List<String> {
|
|
val multiParamSequence: Sequence<Pair<String, String>> = this.multiParams
|
|
.params
|
|
.asSequence()
|
|
.map { e -> e.key to e.value.joinToString(separator = ",") }
|
|
val singleParamSequence: Sequence<Pair<String, String>> = this.singleParams
|
|
.params
|
|
.asSequence()
|
|
.map { it.toPair() }
|
|
return singleParamSequence.plus(multiParamSequence)
|
|
.map { p -> "${p.first}=${p.second}" }
|
|
.toList()
|
|
}
|
|
}
|
|
|
|
sealed class Params<T> {
|
|
abstract val params: Map<String, T>
|
|
}
|
|
|
|
class ParamAlreadySetException(message: String) : IllegalArgumentException(message)
|
|
|
|
class MultiParams(override val params: Map<String, List<String>>) : Params<List<String>>()
|
|
class SingleParams(override val params: Map<String, String>) : Params<String>()
|
|
|
|
class ParamsCollector {
|
|
private val multiParams: MutableMap<String, List<RcdbParamOption<Any>>> = mutableMapOf()
|
|
private val singleParams: MutableMap<String, RcdbParamOption<Any>> = mutableMapOf()
|
|
|
|
fun build() = RcdbParams(buildMulti(), buildSingle())
|
|
|
|
/**
|
|
* Creates the Query Params from this builder.
|
|
* If no Search type has been set, this will default to "Coaster"
|
|
*/
|
|
private fun buildMulti() = multiParams.apply {
|
|
// Defaults go here, if any
|
|
}
|
|
.filter { it.value.isNotEmpty() }
|
|
.mapValues { e -> e.value.map { o -> o.paramValue.toString() } }
|
|
.let { MultiParams(it) }
|
|
|
|
private fun buildSingle() = singleParams.apply {
|
|
putIfAbsent(SearchType.paramKey, SearchType.COASTER)
|
|
}
|
|
.mapValues { e -> e.value.paramValue.toString() }
|
|
.let { SingleParams(it) }
|
|
|
|
operator fun set(paramName: String, options: List<RcdbParamOption<Any>>) {
|
|
this.multiParams[paramName] = options
|
|
}
|
|
|
|
operator fun set(paramName: String, option: RcdbParamOption<Any>) {
|
|
if (paramName !in singleParams && paramName !in multiParams) {
|
|
this.singleParams[paramName] = option
|
|
} else {
|
|
throw ParamAlreadySetException("Parameter $paramName already set.")
|
|
}
|
|
}
|
|
|
|
fun getSingle(paramName: String) = this.multiParams[paramName] ?: this.singleParams[paramName]
|
|
fun getMulti(paramName: String) = this.multiParams[paramName]
|
|
|
|
fun keys() = this.multiKeys().plus(singleKeys())
|
|
private fun multiKeys() = this.multiParams.keys.toSet()
|
|
private fun singleKeys() = this.singleParams.keys.toSet()
|
|
}
|
|
|
|
fun rcdbQuery(body: ParamsCollector.() -> ParamsCollector) =
|
|
RcdbUrlQuery("https://www.rcdb.com/r.htm?", rcdbQueryParams(body)).toString()
|
|
|
|
data class RcdbUrlQuery(val baseUrl: String, val params: RcdbParams) {
|
|
override fun toString(): String {
|
|
return params.toStrings()
|
|
.joinToString(prefix = baseUrl, separator = "&")
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Builder for the parameters only (mainly because it might be possilbe in the future to have an API with a POST search object?
|
|
*/
|
|
fun rcdbQueryParams(body: ParamsCollector.() -> ParamsCollector): RcdbParams {
|
|
val builder = ParamsCollector()
|
|
builder.body()
|
|
return builder.build()
|
|
}
|