diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt index 4f51cd9..318ebca 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Classification.kt @@ -1,6 +1,6 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder enum class Classification( override val prettyName: String, @@ -19,7 +19,7 @@ enum class Classification( } } -fun RcdbQueryParamsBuilder.classification(body: ClassificationBuilder.() -> ClassificationBuilder): RcdbQueryParamsBuilder { +fun MultiParamsBuilder.classification(body: ClassificationBuilder.() -> ClassificationBuilder): MultiParamsBuilder { val builder = ClassificationBuilder() builder.body() this[Classification.staticParamName] = builder.build() diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOptionBuilder.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/MultiParamBuilder.kt similarity index 82% rename from src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOptionBuilder.kt rename to src/main/kotlin/de/pheerai/rcdbquery/dataMappings/MultiParamBuilder.kt index 9bd686e..9018a0b 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOptionBuilder.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/MultiParamBuilder.kt @@ -1,20 +1,20 @@ package de.pheerai.rcdbquery.dataMappings // TODO: Find way to only have one generic parameter -sealed class RcdbParamOptionBuilder> { +sealed class MultiParamBuilder> { private val paramList: MutableList = mutableListOf() - open fun add(param: T): RcdbParamOptionBuilder { + open fun add(param: T): MultiParamBuilder { paramList.add(param) return this } - protected open fun addAll(items: Array): RcdbParamOptionBuilder { + protected open fun addAll(items: Array): MultiParamBuilder { paramList.addAll(items) return this } - protected open fun addAll(items: Collection): RcdbParamOptionBuilder { + protected open fun addAll(items: Collection): MultiParamBuilder { paramList.addAll(items) return this } @@ -22,7 +22,7 @@ sealed class RcdbParamOptionBuilder> { fun build() = paramList.toList() } -class VendorBuilder : RcdbParamOptionBuilder() { +class VendorBuilder : MultiParamBuilder() { override fun add(param: Vendor): VendorBuilder { super.add(param) return this @@ -36,7 +36,7 @@ class VendorBuilder : RcdbParamOptionBuilder() { fun gerstlauer() = this.add(Vendor.GERSTLAUER) } -class OrderBuilder : RcdbParamOptionBuilder() { +class OrderBuilder : MultiParamBuilder() { override fun add(param: Order): OrderBuilder { super.add(param) return this @@ -77,10 +77,10 @@ class OrderBuilder : RcdbParamOptionBuilder() { fun rideTime() = this.add(Order.RIDE_TIME) fun state() = this.add(Order.STATUS) fun closing() = this.add(Order.CLOSING) - fun all() = this.addAll(Order.values().filter { it.relevantForAll }) + fun allRelevant() = this.addAll(Order.values().filter { it.relevantForAll }) } -class StatusBuilder : RcdbParamOptionBuilder() { +class StatusBuilder : MultiParamBuilder() { override fun add(param: Status): StatusBuilder { super.add(param) return this @@ -92,7 +92,7 @@ class StatusBuilder : RcdbParamOptionBuilder() { fun stored() = this.add(Status.STORED) } -class ClassificationBuilder : RcdbParamOptionBuilder() { +class ClassificationBuilder : MultiParamBuilder() { override fun add(param: Classification): ClassificationBuilder { super.add(param) return this diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt index fc2ca96..bb6ed22 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt @@ -1,6 +1,6 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder @Suppress("unused") enum class Order( @@ -51,7 +51,7 @@ enum class Order( } } -fun RcdbQueryParamsBuilder.sortBy(body: OrderBuilder.() -> OrderBuilder): RcdbQueryParamsBuilder { +fun MultiParamsBuilder.sortBy(body: OrderBuilder.() -> OrderBuilder): MultiParamsBuilder { val builder = OrderBuilder() builder.body() this[Order.staticParamName] = builder.build() diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt index 6930a0b..e73423e 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Page.kt @@ -1,6 +1,6 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder class Page(override val paramValue: Int) : RcdbParamOption { override val fullName = "The page to show" @@ -11,7 +11,7 @@ class Page(override val paramValue: Int) : RcdbParamOption { } } -fun RcdbQueryParamsBuilder.page(page: Int): RcdbQueryParamsBuilder = if (Page.staticParamName !in this.keys()) { +fun MultiParamsBuilder.page(page: Int) = if (Page.staticParamName !in this.keys()) { also { this[Page.staticParamName] = listOf(Page(page)) } } else { error( diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt index 5a7b462..48e98c6 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchTerm.kt @@ -1,6 +1,6 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder class SearchTerm(override val paramValue: String) : RcdbParamOption { override val prettyName = "Search Term" @@ -11,7 +11,7 @@ class SearchTerm(override val paramValue: String) : RcdbParamOption { } } -fun RcdbQueryParamsBuilder.searchTerm(term: String): RcdbQueryParamsBuilder = +fun MultiParamsBuilder.searchTerm(term: String) = if (SearchTerm.staticParamName !in this.keys()) { also { this[SearchTerm.staticParamName] = listOf(SearchTerm(term)) } } else { diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt index 0ca5920..8eb4bf1 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt @@ -1,6 +1,6 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder @Suppress("unused") enum class SearchType( @@ -19,7 +19,7 @@ enum class SearchType( } } -fun RcdbQueryParamsBuilder.searchType(searchType: SearchType): RcdbQueryParamsBuilder = +fun MultiParamsBuilder.searchType(searchType: SearchType) = if (SearchType.staticParamName !in this.keys()) { also { this[SearchType.staticParamName] = listOf(searchType) } } else { diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt index 1cc382e..8995d1c 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/StartsWith.kt @@ -2,7 +2,7 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder class StartsWith(override val paramValue: String) : RcdbParamOption { override val prettyName = "Starts with" @@ -13,7 +13,7 @@ class StartsWith(override val paramValue: String) : RcdbParamOption { } } -fun RcdbQueryParamsBuilder.startsWith(term: String) = if (StartsWith.staticParamName !in this.keys()) { +fun MultiParamsBuilder.startsWith(term: String) = if (StartsWith.staticParamName !in this.keys()) { also { this[StartsWith.staticParamName] = listOf(StartsWith(term)) } } else { error( diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Status.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Status.kt index db1135a..2f1dc39 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Status.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Status.kt @@ -1,6 +1,6 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder @Suppress("unused") enum class Status( @@ -29,7 +29,7 @@ enum class Status( } } -fun RcdbQueryParamsBuilder.status(body: StatusBuilder.() -> StatusBuilder): RcdbQueryParamsBuilder { +fun MultiParamsBuilder.status(body: StatusBuilder.() -> StatusBuilder): MultiParamsBuilder { val builder = StatusBuilder() builder.body() this[Status.staticParamName] = builder.build() diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt index 0d7fd27..ed03f94 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt @@ -1,6 +1,6 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder @Suppress("unused") enum class Vendor( @@ -244,7 +244,7 @@ enum class Vendor( companion object { const val staticParamName = "mk" - fun getByName(name: String): Vendor? = values().firstOrNull { it.prettyName == name } + fun getByName(name: String) = values().firstOrNull { it.prettyName == name } fun searchByName(name: String): List { val searchName = name.toLowerCase() return values().filter { @@ -254,7 +254,7 @@ enum class Vendor( } } -fun RcdbQueryParamsBuilder.vendors(body: VendorBuilder.() -> VendorBuilder): RcdbQueryParamsBuilder { +fun MultiParamsBuilder.vendors(body: VendorBuilder.() -> VendorBuilder): MultiParamsBuilder { val builder = VendorBuilder() builder.body() this[Vendor.staticParamName] = builder.build() diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt index 222a68d..de2fb9a 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dataMappings/unknownParams.kt @@ -1,14 +1,13 @@ package de.pheerai.rcdbquery.dataMappings -import de.pheerai.rcdbquery.dsl.RcdbQueryParamsBuilder +import de.pheerai.rcdbquery.dsl.MultiParamsBuilder -//region Unknown fields @Suppress("unused") @Deprecated( "The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)", ReplaceWith("sortBy"), DeprecationLevel.ERROR ) -fun RcdbQueryParamsBuilder.extraColumns(orders: List): Nothing = +fun MultiParamsBuilder.extraColumns(orders: List): Nothing = error("The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)") @Suppress("unused") @@ -16,5 +15,5 @@ fun RcdbQueryParamsBuilder.extraColumns(orders: List): Nothing = "The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)", ReplaceWith("sortBy"), DeprecationLevel.ERROR ) -fun RcdbQueryParamsBuilder.extraColumns(vararg orders: Order): Nothing = +fun MultiParamsBuilder.extraColumns(vararg orders: Order): Nothing = error("The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)") diff --git a/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt b/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt index 1de3548..095ee55 100644 --- a/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt +++ b/src/main/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt @@ -3,37 +3,47 @@ package de.pheerai.rcdbquery.dsl import de.pheerai.rcdbquery.dataMappings.RcdbParamOption import de.pheerai.rcdbquery.dataMappings.SearchType -class RcdbQueryParams(val params: Map>) +// In preparation for new handler +sealed class Params { + abstract val params: Map +} -class RcdbQueryParamsBuilder { - // TODO: Make way for single-valued params as well - private val params: MutableMap>> = mutableMapOf() +class MultiParams(override val params: Map>) : Params>() +class SingleParams(override val params: Map) : Params() + +interface ParamsBuilder { + fun build(): T + operator fun set(paramName: String, options: U) +} + +class MultiParamsBuilder : ParamsBuilder>> { + private val multiParams: 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 { + override fun build() = multiParams.apply { putIfAbsent(SearchType.staticParamName, listOf(SearchType.COASTER)) } .filter { it.value.isNotEmpty() } .mapValues { e -> e.value.map { o -> o.paramValue.toString() } } - .let { RcdbQueryParams(it) } + .let { MultiParams(it) } - operator fun set(paramName: String, options: List>) { - this.params[paramName] = options + override operator fun set(paramName: String, options: List>) { + this.multiParams[paramName] = options } - operator fun get(paramName: String) = this.params[paramName] + operator fun get(paramName: String) = this.multiParams[paramName] - fun keys() = this.params.keys.toSet() + fun keys() = this.multiParams.keys.toSet() } -fun rcdbQuery(body: RcdbQueryParamsBuilder.() -> RcdbQueryParamsBuilder) = +fun rcdbQuery(body: MultiParamsBuilder.() -> MultiParamsBuilder) = RcdbUrlQuery("https://www.rcdb.com/r.htm?", rcdbQueryParams(body)).toString() -data class RcdbUrlQuery(val baseUrl: String, val params: RcdbQueryParams) { +data class RcdbUrlQuery(val baseUrl: String, val params: MultiParams) { override fun toString(): String { return params.params .asSequence() @@ -46,8 +56,8 @@ data class RcdbUrlQuery(val baseUrl: String, val params: RcdbQueryParams) { /** * 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() +fun rcdbQueryParams(body: MultiParamsBuilder.() -> MultiParamsBuilder): MultiParams { + val builder = MultiParamsBuilder() builder.body() return builder.build() }