55 lines
1.8 KiB
Kotlin
55 lines
1.8 KiB
Kotlin
package de.pheerai.rcdbquery.dsl
|
|
|
|
import de.pheerai.rcdbquery.dataMappings.RcdbParamOption
|
|
import de.pheerai.rcdbquery.dataMappings.SearchType
|
|
|
|
class RcdbQueryParams(val params: Map<String, List<String>>)
|
|
|
|
class RcdbQueryParamsBuilder {
|
|
// TODO: Make way for single-valued params as well
|
|
private val params: MutableMap<String, List<RcdbParamOption<Any>>> = mutableMapOf()
|
|
|
|
/**
|
|
* Creates the Query Params from this builder.
|
|
* If no Search type has been set, this will default to "Coaster"
|
|
*/
|
|
fun build() = params.apply {
|
|
putIfAbsent(SearchType.staticParamName, listOf(SearchType.COASTER))
|
|
}
|
|
.filter { it.value.isNotEmpty() }
|
|
.mapValues { e -> e.value.map { o -> o.paramValue.toString() } }
|
|
.let { RcdbQueryParams(it) }
|
|
|
|
|
|
operator fun set(paramName: String, options: List<RcdbParamOption<Any>>) {
|
|
this.params[paramName] = options
|
|
}
|
|
|
|
operator fun get(paramName: String) = this.params[paramName]
|
|
|
|
fun keys() = this.params.keys.toSet()
|
|
}
|
|
|
|
fun rcdbQuery(body: RcdbQueryParamsBuilder.() -> RcdbQueryParamsBuilder) =
|
|
RcdbUrlQuery("https://www.rcdb.com/r.htm?", rcdbQueryParams(body)).toString()
|
|
|
|
data class RcdbUrlQuery(val baseUrl: String, val params: RcdbQueryParams) {
|
|
override fun toString(): String {
|
|
return params.params
|
|
.asSequence()
|
|
.map { e -> e.key to e.value.joinToString(separator = ",") }
|
|
.map { p -> "${p.first}=${p.second}" }
|
|
.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: RcdbQueryParamsBuilder.() -> RcdbQueryParamsBuilder): RcdbQueryParams {
|
|
val builder = RcdbQueryParamsBuilder()
|
|
builder.body()
|
|
return builder.build()
|
|
}
|
|
|