package de.pheerai.rcdbquery.dsl import de.pheerai.rcdbquery.dataMappings.RcdbParamOption import de.pheerai.rcdbquery.dataMappings.SearchType class RcdbQueryParams(val params: Map>) class RcdbQueryParamsBuilder { // TODO: Make way for single-valued params as well private val params: MutableMap>> = 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>) { 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() }