From ca73ff8e1970bff1acae947e3e08ba38f134fa5c Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 18 Apr 2023 19:19:38 +0600 Subject: [PATCH] add support of native in startup --- CHANGELOG.md | 3 ++ extensions.gradle | 2 +- ...gradle => mppJvmJsLinuxMingwProject.gradle | 2 ++ startup/launcher/build.gradle | 2 +- startup/plugin/build.gradle | 12 ++++++- .../kotlin/StartPluginSerializer.kt | 36 +++++++++++++++++++ .../kotlin/StartPluginSerializer.kt | 36 +++++++++++++++++++ 7 files changed, 90 insertions(+), 3 deletions(-) rename mppJsAndJavaProject.gradle => mppJvmJsLinuxMingwProject.gradle (97%) create mode 100644 startup/plugin/src/linuxX64Main/kotlin/StartPluginSerializer.kt create mode 100644 startup/plugin/src/mingwX64Main/kotlin/StartPluginSerializer.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index c7358aadd54..0de0a93638a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.17.7 +* `Startup`: + * Add support of `linuxX64` and `mingwX64` platforms + ## 0.17.6 * `Versions`: diff --git a/extensions.gradle b/extensions.gradle index 5399f555dfc..1028b0c59b3 100644 --- a/extensions.gradle +++ b/extensions.gradle @@ -23,7 +23,7 @@ allprojects { mppProjectWithSerializationPresetPath = "${rootProject.projectDir.absolutePath}/mppProjectWithSerialization.gradle" mppProjectWithSerializationAndComposePresetPath = "${rootProject.projectDir.absolutePath}/mppProjectWithSerializationAndCompose.gradle" mppJavaProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppJavaProject.gradle" - mppJsAndJavaProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppJsAndJavaProject.gradle" + mppJvmJsLinuxMingwProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppJvmJsLinuxMingwProject.gradle" mppAndroidProjectPresetPath = "${rootProject.projectDir.absolutePath}/mppAndroidProject.gradle" defaultAndroidSettingsPresetPath = "${rootProject.projectDir.absolutePath}/defaultAndroidSettings.gradle" diff --git a/mppJsAndJavaProject.gradle b/mppJvmJsLinuxMingwProject.gradle similarity index 97% rename from mppJsAndJavaProject.gradle rename to mppJvmJsLinuxMingwProject.gradle index 4b24838a9f3..1a5b08c7de5 100644 --- a/mppJsAndJavaProject.gradle +++ b/mppJvmJsLinuxMingwProject.gradle @@ -15,6 +15,8 @@ kotlin { browser() nodejs() } + linuxX64() + mingwX64() sourceSets { commonMain { diff --git a/startup/launcher/build.gradle b/startup/launcher/build.gradle index e80e77abe88..38fe1179d7a 100644 --- a/startup/launcher/build.gradle +++ b/startup/launcher/build.gradle @@ -4,7 +4,7 @@ plugins { id "application" } -apply from: "$mppJsAndJavaProjectPresetPath" +apply from: "$mppJvmJsLinuxMingwProjectPresetPath" kotlin { sourceSets { diff --git a/startup/plugin/build.gradle b/startup/plugin/build.gradle index 64b4acd8103..97fc6fe3f86 100644 --- a/startup/plugin/build.gradle +++ b/startup/plugin/build.gradle @@ -3,7 +3,7 @@ plugins { id "org.jetbrains.kotlin.plugin.serialization" } -apply from: "$mppJsAndJavaProjectPresetPath" +apply from: "$mppJvmJsLinuxMingwProjectPresetPath" kotlin { sourceSets { @@ -21,5 +21,15 @@ kotlin { api libs.uuid } } + linuxX64Main { + dependencies { + api libs.uuid + } + } + mingwX64Main { + dependencies { + api libs.uuid + } + } } } diff --git a/startup/plugin/src/linuxX64Main/kotlin/StartPluginSerializer.kt b/startup/plugin/src/linuxX64Main/kotlin/StartPluginSerializer.kt new file mode 100644 index 00000000000..176d0995bcb --- /dev/null +++ b/startup/plugin/src/linuxX64Main/kotlin/StartPluginSerializer.kt @@ -0,0 +1,36 @@ +package dev.inmo.micro_utils.startup.plugin + +import com.benasher44.uuid.uuid4 +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlin.reflect.KClass + +actual object StartPluginSerializer : KSerializer { + private val registeredPlugins = mutableMapOf() + private val registeredPluginsByPlugin = mutableMapOf() + override val descriptor: SerialDescriptor = String.serializer().descriptor + + override fun deserialize(decoder: Decoder): StartPlugin { + val name = decoder.decodeString() + return registeredPlugins[name] ?: error("Unable to find startup plugin for $name") + } + + override fun serialize(encoder: Encoder, value: StartPlugin) { + val name = registeredPluginsByPlugin[value] ?: uuid4().toString().also { + registeredPlugins[it] = value + registeredPluginsByPlugin[value] = it + } + encoder.encodeString(name) + } + + /** + * Register plugin inside of this [KSerializer]. Since plugin has been registered, you may use its [name] in any + * serialized [dev.inmo.micro_utils.startup.launcher.Config] to retrieve [plugin] you passed here + */ + fun registerPlugin(name: String, plugin: StartPlugin) { + registeredPlugins[name] = plugin + } +} diff --git a/startup/plugin/src/mingwX64Main/kotlin/StartPluginSerializer.kt b/startup/plugin/src/mingwX64Main/kotlin/StartPluginSerializer.kt new file mode 100644 index 00000000000..176d0995bcb --- /dev/null +++ b/startup/plugin/src/mingwX64Main/kotlin/StartPluginSerializer.kt @@ -0,0 +1,36 @@ +package dev.inmo.micro_utils.startup.plugin + +import com.benasher44.uuid.uuid4 +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlin.reflect.KClass + +actual object StartPluginSerializer : KSerializer { + private val registeredPlugins = mutableMapOf() + private val registeredPluginsByPlugin = mutableMapOf() + override val descriptor: SerialDescriptor = String.serializer().descriptor + + override fun deserialize(decoder: Decoder): StartPlugin { + val name = decoder.decodeString() + return registeredPlugins[name] ?: error("Unable to find startup plugin for $name") + } + + override fun serialize(encoder: Encoder, value: StartPlugin) { + val name = registeredPluginsByPlugin[value] ?: uuid4().toString().also { + registeredPlugins[it] = value + registeredPluginsByPlugin[value] = it + } + encoder.encodeString(name) + } + + /** + * Register plugin inside of this [KSerializer]. Since plugin has been registered, you may use its [name] in any + * serialized [dev.inmo.micro_utils.startup.launcher.Config] to retrieve [plugin] you passed here + */ + fun registerPlugin(name: String, plugin: StartPlugin) { + registeredPlugins[name] = plugin + } +}