diff --git a/build.gradle.kts b/build.gradle.kts index 4375518..69b71d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget + plugins { id("org.jetbrains.kotlin.multiplatform") } @@ -28,8 +30,18 @@ kotlin { // For Linux, should be changed to e.g. linuxX64 // For MacOS, should be changed to e.g. macosX64 // For Windows, should be changed to e.g. mingwX64 + linuxX64("linuxX64") - linuxArm64("linuxAArch") + linuxArm64("linuxArm64") + linuxArm32Hfp("linuxArm32") + targets.withType { + binaries { + executable { + entryPoint("de.pheerai.rcdbquery.main") + } + } + } + sourceSets { commonMain { dependencies { @@ -54,9 +66,6 @@ kotlin { } } getByName("jsMain") { - dependencies { - implementation(kotlin("stdlib-js")) - } } getByName("jsTest") { dependencies { @@ -67,9 +76,12 @@ kotlin { } getByName("linuxX64Test") { } - getByName("linuxAArchMain") { + getByName("linuxArm64Main") { } - getByName("linuxAArchTest") { + getByName("linuxArm64Test") { + } + all { + languageSettings.enableLanguageFeature("InlineClasses") } } } diff --git a/src/commonMain/kotlin/de/pheerai/rcdbquery/Sample.kt b/src/commonMain/kotlin/de/pheerai/rcdbquery/Sample.kt index 5a9e03c..6e03bca 100644 --- a/src/commonMain/kotlin/de/pheerai/rcdbquery/Sample.kt +++ b/src/commonMain/kotlin/de/pheerai/rcdbquery/Sample.kt @@ -1,5 +1,8 @@ package de.pheerai.rcdbquery +import de.pheerai.rcdbquery.dataMappings.* +import de.pheerai.rcdbquery.dsl.* + expect class Sample() { fun checkMe(): Int } @@ -9,3 +12,20 @@ expect object Platform { } fun hello(): String = "Hello from ${Platform.name}" + +fun generateQueryUrl() = rcdbQuery { + searchFor(SearchType.COASTER) + vendors( + Vendor.INTAMIN, + Vendor.MACK + ) + sortBy( + Order.MANUFACTURER, + Order.INVERSIONS + ) + custom( + "foo", + createRcdbParam(paramId = 12), + createRcdbParam(paramId = 24) + ) +} diff --git a/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt new file mode 100644 index 0000000..78266b2 --- /dev/null +++ b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/Order.kt @@ -0,0 +1,16 @@ +package de.pheerai.rcdbquery.dataMappings + +enum class Order( + override val prettyName: String, + override val fullName: String, + override val paramId: Int +) : RcdbParamOption { + MANUFACTURER("Manufacturer", 30), + INVERSIONS("Inversion", "Number of inversions", 24); + + constructor(name: String, paramId: Int) : this(name, name, paramId) + + companion object { + const val staticParamName = "order" + } +} diff --git a/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOption.kt b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOption.kt new file mode 100644 index 0000000..1caa5c2 --- /dev/null +++ b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbParamOption.kt @@ -0,0 +1,20 @@ +package de.pheerai.rcdbquery.dataMappings + +interface RcdbParamOption { + val prettyName: String + val fullName: String + val paramId: Int +} + +fun createRcdbParam( + prettyName: String = "", + fullName:String = "", + paramId: Int = -1 +) : RcdbParamOption = object : RcdbParamOption { + override val prettyName: String + get() = prettyName + override val fullName: String + get() = fullName + override val paramId: Int + get() = paramId +} diff --git a/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbQueryParams.kt b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbQueryParams.kt new file mode 100644 index 0000000..b102999 --- /dev/null +++ b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/RcdbQueryParams.kt @@ -0,0 +1,8 @@ +package de.pheerai.rcdbquery.dataMappings + +data class RcdbQueryParam(val paramName: String, val paramOptions: List) +data class RcdbQueryParamBuilder(var paramName: String, val paramOption: MutableList) { + fun append(option: T) { + this.paramOption.add(option) + } +} diff --git a/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt new file mode 100644 index 0000000..6253754 --- /dev/null +++ b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/SearchType.kt @@ -0,0 +1,14 @@ +package de.pheerai.rcdbquery.dataMappings + +enum class SearchType( + override val prettyName: String, + override val fullName: String, + override val paramId: Int +) : RcdbParamOption { + COASTER("Coaster", "Search for Roller Coaster", 2) + ; + + companion object { + const val staticParamName = "ot" + } +} diff --git a/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt index 2f8d669..b34846f 100644 --- a/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt +++ b/src/commonMain/kotlin/de/pheerai/rcdbquery/dataMappings/Vendor.kt @@ -1,8 +1,12 @@ package de.pheerai.rcdbquery.dataMappings -enum class Vendor(val prettyName: String, val fullName: String, val queryId: Int) { - INTAMIN("Intamin","Intamin Amusement Rides", 6837), - VEKOMA("Vekoma", 6836), +enum class Vendor( + override val prettyName: String, + override val fullName: String, + override val paramId: Int +) : RcdbParamOption { + INTAMIN("Intamin", "Intamin Amusement Rides", 6837), + VEKOMA("Vekoma", 6836), MACK("Mack Rides", "Mack Rides GmbH & Co KG", 6856), GERSTLAUER("Gerstlauer", "Gerstlauer Amusement Rides GmbH", 6948), ZIERER("Zierer", 6861), @@ -14,16 +18,11 @@ enum class Vendor(val prettyName: String, val fullName: String, val queryId: Int RMC("RMC", "Rocky Mountain Construction", 10583) ; - constructor(name: String, queryId: Int) : this(name, name, queryId) - - val queryParam - get() = "${queryParamName}=${this.queryId}" + constructor(name: String, paramId: Int) : this(name, name, paramId) companion object { - const val queryParamName = "mk" + const val staticParamName = "mk" - fun createQueryParam(vararg vendors: Vendor) = vendors.joinToString("&") { it.queryParam } - fun createQueryParam(name: String): String = createQueryParam(*searchByName(name).toTypedArray()) fun getByName(name: String): Vendor? = values().firstOrNull { it.prettyName == name } fun searchByName(name: String): List { val searchName = name.toLowerCase() diff --git a/src/commonMain/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt b/src/commonMain/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt new file mode 100644 index 0000000..6a9229d --- /dev/null +++ b/src/commonMain/kotlin/de/pheerai/rcdbquery/dsl/rcdbQueryDsl.kt @@ -0,0 +1,74 @@ +package de.pheerai.rcdbquery.dsl + +import de.pheerai.rcdbquery.dataMappings.* + +inline class RcdbQueryParams(val params: Map>) +class RcdbQueryParamsBuilder { + // TODO: Somewhat wrap away, then use param of one option. + private val params: MutableMap> = mutableMapOf() + + fun build() = RcdbQueryParams( + params + .filter { it.value.isNotEmpty() } + .mapValues { e -> e.value.map { o -> o.paramId } } + ) + + operator fun set(paramName: String, options: List) { + when (paramName) { + "order" -> if (this.params.containsKey(paramName)) { + this.params[paramName] = this.params[paramName].append(options) + } else { + this.params[paramName] = options + } + else -> this.params[paramName] = options + } + } + + private fun List?.append(options: List) = this?.toMutableList()?.also { it.addAll(options) } ?: options +} + +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 = "&") + } +} + +fun rcdbQueryParams(body: RcdbQueryParamsBuilder.() -> RcdbQueryParamsBuilder): RcdbQueryParams { + val builder = RcdbQueryParamsBuilder() + builder.body() + return builder.build() +} + +/* TODO: Even better typing (usage of + * ``` + * vendors { + * vekoma() + * intamin() + * of(Vendors.PRESTON_AND_BARBIERI) + * } + * ``` + * instead. + * Maybe use inline class for MutableList / List? + */ +fun RcdbQueryParamsBuilder.vendors(vendors: List) = apply { this[Vendor.staticParamName] = vendors } + +fun RcdbQueryParamsBuilder.vendors(vararg vendors: Vendor) = this.vendors(vendors.asList()) + +fun RcdbQueryParamsBuilder.sortBy(orders: List) = apply { + this[Order.staticParamName] =orders +} + +fun RcdbQueryParamsBuilder.sortBy(vararg orders: Order) = this.sortBy(orders.asList()) + +fun RcdbQueryParamsBuilder.searchFor(searchType: SearchType) = + apply { this[SearchType.staticParamName] = listOf(searchType) } + +fun RcdbQueryParamsBuilder.custom(paramName: String, values: List) = apply { this[paramName] = values } +fun RcdbQueryParamsBuilder.custom(paramName: String, vararg values: RcdbParamOption) = apply { this[paramName] = values.asList() } diff --git a/src/commonTest/kotlin/de/pheerai/rcdbquery/dataMappings/VendorTest.kt b/src/commonTest/kotlin/de/pheerai/rcdbquery/dataMappings/VendorTest.kt deleted file mode 100644 index ad5bdaf..0000000 --- a/src/commonTest/kotlin/de/pheerai/rcdbquery/dataMappings/VendorTest.kt +++ /dev/null @@ -1,52 +0,0 @@ -package de.pheerai.rcdbquery.dataMappings - -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNull - -class VendorTest { - @Test - fun testQueryParam() { - assertEquals( - "mk=6837", - Vendor.INTAMIN.queryParam - ) - } - - @Test - fun testQueryParamsGeneration() { - assertEquals( - "mk=6837&mk=6836", - Vendor.createQueryParam(Vendor.INTAMIN, Vendor.VEKOMA), - "Generation by Enum lookup failed." - ) - assertEquals( - "mk=6836&mk=6856&mk=6905", - Vendor.createQueryParam("Ma"), - "Generation by name search failed." - ) - } - - @Test - fun testGetByName() { - assertEquals( - Vendor.INTAMIN, - Vendor.getByName("Intamin") - ) - assertNull( - Vendor.getByName("asdf anjfejasdnf njnas") - ) - } - - @Test - fun testSearchByName() { - assertEquals( - listOf(Vendor.VEKOMA, Vendor.MACK, Vendor.MAURER), - Vendor.searchByName("ma") - ) - assertEquals( - listOf(), - Vendor.searchByName("asdf anjfejasdnf njnas") - ) - } -} diff --git a/src/commonTest/kotlin/de/pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt b/src/commonTest/kotlin/de/pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt new file mode 100644 index 0000000..0a0e510 --- /dev/null +++ b/src/commonTest/kotlin/de/pheerai/rcdbquery/dsl/RcdbQueryDslTest.kt @@ -0,0 +1,26 @@ +package de.pheerai.rcdbquery.dsl + +import de.pheerai.rcdbquery.dataMappings.Order +import de.pheerai.rcdbquery.dataMappings.Vendor +import kotlin.test.Test +import kotlin.test.assertEquals + +class RcdbQueryDslTest { + @Test + fun testQueryParamBuilder() { + assertEquals( + "https://www.rcdb.com/r.htm?mk=6836,6856,6905&order=24,30", + rcdbQuery { + vendors( + Vendor.VEKOMA, + Vendor.MACK, + Vendor.MAURER + ) + sortBy( + Order.INVERSIONS, + Order.MANUFACTURER + ) + } + ) + } +} diff --git a/src/jvmMain/kotlin/de/pheerai/rcdbquery/SampleJvm.kt b/src/jvmMain/kotlin/de/pheerai/rcdbquery/SampleJvm.kt index 9f17caf..d52053b 100644 --- a/src/jvmMain/kotlin/de/pheerai/rcdbquery/SampleJvm.kt +++ b/src/jvmMain/kotlin/de/pheerai/rcdbquery/SampleJvm.kt @@ -7,3 +7,7 @@ actual class Sample { actual object Platform { actual val name: String = "JVM" } + +fun main() { + print(generateQueryUrl()) +} diff --git a/src/linuxAArchMain/kotlin/de/pheerai/rcdbquery/SampleLinux.kt b/src/linuxArm32Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt similarity index 75% rename from src/linuxAArchMain/kotlin/de/pheerai/rcdbquery/SampleLinux.kt rename to src/linuxArm32Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt index a89985d..3a44061 100644 --- a/src/linuxAArchMain/kotlin/de/pheerai/rcdbquery/SampleLinux.kt +++ b/src/linuxArm32Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt @@ -7,3 +7,7 @@ actual class Sample { actual object Platform { actual val name: String = "Native" } + +fun main() { + println(generateQueryUrl()) +} diff --git a/src/linuxAArchTest/kotlin/de/pheerai/rcdbquery/SampleTestsNative.kt b/src/linuxArm32Test/kotlin/de/pheerai/rcdbquery/SampleTestsNative.kt similarity index 100% rename from src/linuxAArchTest/kotlin/de/pheerai/rcdbquery/SampleTestsNative.kt rename to src/linuxArm32Test/kotlin/de/pheerai/rcdbquery/SampleTestsNative.kt diff --git a/src/linuxArm64Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt b/src/linuxArm64Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt new file mode 100644 index 0000000..3a44061 --- /dev/null +++ b/src/linuxArm64Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt @@ -0,0 +1,13 @@ +package de.pheerai.rcdbquery + +actual class Sample { + actual fun checkMe() = 7 +} + +actual object Platform { + actual val name: String = "Native" +} + +fun main() { + println(generateQueryUrl()) +} diff --git a/src/linuxArm64Test/kotlin/de/pheerai/rcdbquery/SampleTestsNative.kt b/src/linuxArm64Test/kotlin/de/pheerai/rcdbquery/SampleTestsNative.kt new file mode 100644 index 0000000..b71ef62 --- /dev/null +++ b/src/linuxArm64Test/kotlin/de/pheerai/rcdbquery/SampleTestsNative.kt @@ -0,0 +1,11 @@ +package de.pheerai.rcdbquery + +import kotlin.test.Test +import kotlin.test.assertTrue + +class SampleTestsNative { + @Test + fun testHello() { + assertTrue("Native" in hello()) + } +} diff --git a/src/linuxX64Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt b/src/linuxX64Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt index a89985d..3a44061 100644 --- a/src/linuxX64Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt +++ b/src/linuxX64Main/kotlin/de/pheerai/rcdbquery/SampleLinux.kt @@ -7,3 +7,7 @@ actual class Sample { actual object Platform { actual val name: String = "Native" } + +fun main() { + println(generateQueryUrl()) +}