From fa99385ff02a500951158cc62e83f9f380b7ba1f Mon Sep 17 00:00:00 2001
From: huanmeng-qwq <1871735932@qq.com>
Date: Sat, 22 Mar 2025 17:43:04 +0800
Subject: [PATCH] feat: Support kotlin dsl
---
demo/pom.xml | 74 +++++++++++-
.../demo/tests/ConfigurationTest.java | 18 +++
.../demo/tests/conf/KotlinConfiguration.kt | 33 ++++++
features/kotlin/pom.xml | 106 +++++++++++++++++
.../lib/configuration/kotlin/value/Lists.kt | 29 +++++
.../lib/configuration/kotlin/value/Maps.kt | 107 ++++++++++++++++++
.../lib/configuration/kotlin/value/Values.kt | 36 ++++++
pom.xml | 2 +
.../src/test/java/yaml/test/YamlTests.java | 8 ++
9 files changed, 409 insertions(+), 4 deletions(-)
create mode 100644 demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/KotlinConfiguration.kt
create mode 100644 features/kotlin/pom.xml
create mode 100644 features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt
create mode 100644 features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Maps.kt
create mode 100644 features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Values.kt
diff --git a/demo/pom.xml b/demo/pom.xml
index a217cb1..6415e6c 100644
--- a/demo/pom.xml
+++ b/demo/pom.xml
@@ -48,14 +48,22 @@
compile
+
+ ${project.parent.groupId}
+ configured-feature-kotlin
+ ${project.parent.version}
+ compile
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+
+
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
org.apache.maven.plugins
maven-jar-plugin
@@ -68,6 +76,64 @@
org.apache.maven.plugins
maven-javadoc-plugin
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ src/main/java
+ target/generated-sources/annotations
+
+
+
+
+ test-compile
+ test-compile
+
+ test-compile
+
+
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ default-compile
+ none
+
+
+ default-testCompile
+ none
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ testCompile
+ test-compile
+
+ testCompile
+
+
+
+
diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java
index ce21b20..d5cf665 100644
--- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java
+++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java
@@ -1,11 +1,13 @@
package cc.carm.lib.configuration.demo.tests;
import cc.carm.lib.configuration.demo.tests.conf.DemoConfiguration;
+import cc.carm.lib.configuration.demo.tests.conf.KotlinConfiguration;
import cc.carm.lib.configuration.demo.tests.conf.RegistryConfig;
import cc.carm.lib.configuration.demo.tests.model.UserRecord;
import cc.carm.lib.configuration.source.ConfigurationHolder;
import org.jetbrains.annotations.TestOnly;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -80,6 +82,22 @@ public class ConfigurationTest {
}
+ public static void testKotlin(ConfigurationHolder> provider) {
+ provider.initialize(KotlinConfiguration.class);
+
+ System.out.println("> Test Kotlin value before:");
+ System.out.println(KotlinConfiguration.INSTANCE.getLINKED_MAP().get());
+
+ LinkedHashMap map = new LinkedHashMap<>();
+ map.put("Language", "Kotlin");
+ System.out.println("> Test Kotlin value -> " + map);
+ KotlinConfiguration.INSTANCE.getLINKED_MAP().set(map);
+
+ System.out.println("> Test Kotlin value after:");
+ System.out.println(KotlinConfiguration.INSTANCE.getLINKED_MAP().get());
+
+ }
+
public static void save(ConfigurationHolder> provider) {
try {
provider.save();
diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/KotlinConfiguration.kt b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/KotlinConfiguration.kt
new file mode 100644
index 0000000..ccef89e
--- /dev/null
+++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/KotlinConfiguration.kt
@@ -0,0 +1,33 @@
+package cc.carm.lib.configuration.demo.tests.conf
+
+import cc.carm.lib.configuration.Configuration
+import cc.carm.lib.configuration.annotation.ConfigPath
+import cc.carm.lib.configuration.annotation.ConfigVersion
+import cc.carm.lib.configuration.kotlin.value.*
+import java.util.*
+
+@ConfigPath(root = true)
+object KotlinConfiguration : Configuration {
+ @ConfigVersion(1)
+ val VERSION = valueFrom(Double::class) {
+ defaults(1.0)
+ }
+
+ val USER_LIST = listFrom(String::class) {
+ defaults("Carm Jos")
+ }
+
+ val NICKNAME = mapFrom(String::class, ::mutableMapOf) {
+ defaultMap(mapOf("Carm Jos" to "Carm"))
+ parse { v -> v }
+ serialize { v -> v }
+ }
+
+ val LINKED_MAP = linkedMapFrom(String::class) {
+ parse { value ->
+ value
+ }
+ serialize { v -> v }
+ defaults("key", "value")
+ }
+}
\ No newline at end of file
diff --git a/features/kotlin/pom.xml b/features/kotlin/pom.xml
new file mode 100644
index 0000000..cceb257
--- /dev/null
+++ b/features/kotlin/pom.xml
@@ -0,0 +1,106 @@
+
+
+ 4.0.0
+
+ cc.carm.lib
+ configured-parent
+ 4.1.2
+ ../../pom.xml
+
+
+ ${project.jdk.version}
+ ${project.jdk.version}
+ UTF-8
+ UTF-8
+
+
+ configured-feature-kotlin
+ jar
+
+
+
+ ${project.groupId}
+ configured-core
+ ${project.version}
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+ compile
+
+
+
+
+ ${project.basedir}/src/main/kotlin
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ test-compile
+ test-compile
+
+ test-compile
+
+
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ default-compile
+ none
+
+
+ default-testCompile
+ none
+
+
+ compile
+ compile
+
+ compile
+
+
+
+ testCompile
+ test-compile
+
+ testCompile
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt
new file mode 100644
index 0000000..bcddeaf
--- /dev/null
+++ b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt
@@ -0,0 +1,29 @@
+package cc.carm.lib.configuration.kotlin.value
+
+import cc.carm.lib.configuration.adapter.ValueType
+import cc.carm.lib.configuration.builder.list.SourceListBuilder
+import cc.carm.lib.configuration.value.standard.ConfiguredList
+import kotlin.reflect.KClass
+
+inline fun listFrom(
+ clazz: KClass, block: (SourceListBuilder.() -> Unit)
+): ConfiguredList {
+ return listFrom(clazz.java, block)
+}
+
+inline fun listFrom(
+ clazz: Class, block: (SourceListBuilder.() -> Unit)
+): ConfiguredList {
+ return listFrom(ValueType.of(clazz), block)
+}
+
+inline fun listFrom(
+ valueType: ValueType, block: (SourceListBuilder.() -> Unit)
+): ConfiguredList {
+ val configBuilder = ConfiguredList.builderOf(V::class.java)
+ val sourceValueBuilder: SourceListBuilder = if (valueType.rawType == String::class.java) {
+ @Suppress("UNCHECKED_CAST")
+ configBuilder.fromString() as SourceListBuilder
+ } else configBuilder.from(valueType)
+ return sourceValueBuilder.also(block).build()
+}
\ No newline at end of file
diff --git a/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Maps.kt b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Maps.kt
new file mode 100644
index 0000000..e784a38
--- /dev/null
+++ b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Maps.kt
@@ -0,0 +1,107 @@
+package cc.carm.lib.configuration.kotlin.value
+
+import cc.carm.lib.configuration.adapter.ValueType
+import cc.carm.lib.configuration.builder.map.SourceMapBuilder
+import cc.carm.lib.configuration.value.standard.ConfiguredMap
+import java.util.*
+import kotlin.reflect.KClass
+
+inline fun hashmapFrom(
+ clazz: KClass,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ return hashmapFrom(clazz.java, block)
+}
+
+inline fun hashmapFrom(
+ clazz: Class,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ return hashmapFrom(ValueType.of(clazz), block)
+}
+
+inline fun hashmapFrom(
+ valueType: ValueType,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ val mapCreator = ConfiguredMap.builderOf(K::class.java, V::class.java)
+ val sourceValueBuilder: SourceMapBuilder, S, K, V> = mapCreator.asHashMap().from(valueType)
+ return sourceValueBuilder.also(block).build()
+}
+
+inline fun linkedMapFrom(
+ clazz: KClass,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ return linkedMapFrom(clazz.java, block)
+}
+
+inline fun linkedMapFrom(
+ clazz: Class,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ return linkedMapFrom(ValueType.of(clazz), block)
+}
+
+inline fun linkedMapFrom(
+ valueType: ValueType,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ val mapCreator = ConfiguredMap.builderOf(K::class.java, V::class.java)
+ val sourceValueBuilder: SourceMapBuilder, S, K, V> = mapCreator.asLinkedMap().from(valueType)
+ return sourceValueBuilder.also(block).build()
+}
+
+inline fun treeMapFrom(
+ clazz: KClass,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ return treeMapFrom(clazz.java, block)
+}
+
+inline fun treeMapFrom(
+ clazz: Class,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ return treeMapFrom(ValueType.of(clazz), block)
+}
+
+inline fun treeMapFrom(
+ valueType: ValueType,
+ block: SourceMapBuilder, S, K, V>.() -> Unit
+): ConfiguredMap {
+ val mapCreator = ConfiguredMap.builderOf(K::class.java, V::class.java)
+ val sourceValueBuilder: SourceMapBuilder, S, K, V> = mapCreator.asTreeMap().from(valueType)
+ return sourceValueBuilder.also(block).build()
+}
+
+inline fun , S : Any, reified K, reified V> mapFrom(
+ clazz: KClass,
+ noinline map: () -> MAP,
+ block: SourceMapBuilder