summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraSemy <897017+aSemy@users.noreply.github.com>2023-05-09 17:30:56 +0200
committerGitHub <noreply@github.com>2023-05-09 17:30:56 +0200
commit9157bf81283ad3d1b4313873bc81150af2f69a4f (patch)
treed688dcc59260969affdd8bfd9cb5e5a067968b1a
parentef67bcef0e5ee8ef0d19a3d9dcbb08e82a92c511 (diff)
downloadkotlinx.serialization-9157bf81283ad3d1b4313873bc81150af2f69a4f.tar.gz
Implement addAll functions for JsonArrayBuilder (#2156)
Fixes #2127
-rw-r--r--formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt101
-rw-r--r--formats/json/api/kotlinx-serialization-json.api4
-rw-r--r--formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt39
3 files changed, 144 insertions, 0 deletions
diff --git a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt
index 9e4e5722..c2dab089 100644
--- a/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt
+++ b/formats/json-tests/commonTest/src/kotlinx/serialization/json/JsonBuildersTest.kt
@@ -43,4 +43,105 @@ class JsonBuildersTest {
}
assertEquals("""[true,[1,2,3,4,5,6,7,8,9,10],null,{"stringKey":"stringValue"}]""", json.toString())
}
+
+ @Test
+ fun testBuildJsonArrayAddAll() {
+ assertEquals(
+ """[1,2,3,4,5,null]""",
+ buildJsonArray {
+ assertTrue { addAll(listOf(1, 2, 3, 4, 5, null)) }
+ }.toString()
+ )
+
+ assertEquals(
+ """["a","b","c",null]""",
+ buildJsonArray {
+ assertTrue { addAll(listOf("a", "b", "c", null)) }
+ }.toString()
+ )
+
+ assertEquals(
+ """[true,false,null]""",
+ buildJsonArray {
+ assertTrue { addAll(listOf(true, false, null)) }
+ }.toString()
+ )
+
+ assertEquals(
+ """[2,"b",true,null]""",
+ buildJsonArray {
+ assertTrue {
+ addAll(
+ listOf(
+ JsonPrimitive(2),
+ JsonPrimitive("b"),
+ JsonPrimitive(true),
+ JsonNull,
+ )
+ )
+ }
+ }.toString()
+ )
+
+ assertEquals(
+ """[{},{},{},null]""",
+ buildJsonArray {
+ assertTrue {
+ addAll(
+ listOf(
+ JsonObject(emptyMap()),
+ JsonObject(emptyMap()),
+ JsonObject(emptyMap()),
+ JsonNull
+ )
+ )
+ }
+ }.toString()
+ )
+
+ assertEquals(
+ """[[],[],[],null]""",
+ buildJsonArray {
+ assertTrue {
+ addAll(
+ listOf(
+ JsonArray(emptyList()),
+ JsonArray(emptyList()),
+ JsonArray(emptyList()),
+ JsonNull
+ )
+ )
+ }
+ }.toString()
+ )
+
+ assertEquals(
+ """[null,null]""",
+ buildJsonArray {
+ assertTrue {
+ addAll(listOf(JsonNull, JsonNull))
+ }
+ }.toString()
+ )
+ }
+
+ @Test
+ fun testBuildJsonArrayAddAllNotModified() {
+ assertEquals(
+ """[]""",
+ buildJsonArray {
+ // add collections
+ assertFalse { addAll(listOf<Number>()) }
+ assertFalse { addAll(listOf<String>()) }
+ assertFalse { addAll(listOf<Boolean>()) }
+
+ // add json elements
+ assertFalse { addAll(listOf()) }
+ assertFalse { addAll(listOf<JsonNull>()) }
+ assertFalse { addAll(listOf<JsonObject>()) }
+ assertFalse { addAll(listOf<JsonArray>()) }
+ assertFalse { addAll(listOf<JsonPrimitive>()) }
+ }.toString()
+ )
+ }
}
diff --git a/formats/json/api/kotlinx-serialization-json.api b/formats/json/api/kotlinx-serialization-json.api
index 898a94a0..fec5e1b5 100644
--- a/formats/json/api/kotlinx-serialization-json.api
+++ b/formats/json/api/kotlinx-serialization-json.api
@@ -70,6 +70,7 @@ public final class kotlinx/serialization/json/JsonArray$Companion {
public final class kotlinx/serialization/json/JsonArrayBuilder {
public fun <init> ()V
public final fun add (Lkotlinx/serialization/json/JsonElement;)Z
+ public final fun addAll (Ljava/util/Collection;)Z
public final fun build ()Lkotlinx/serialization/json/JsonArray;
}
@@ -173,6 +174,9 @@ public final class kotlinx/serialization/json/JsonElementBuildersKt {
public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/Number;)Z
public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/String;)Z
public static final fun add (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/lang/Void;)Z
+ public static final fun addAllBooleans (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z
+ public static final fun addAllNumbers (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z
+ public static final fun addAllStrings (Lkotlinx/serialization/json/JsonArrayBuilder;Ljava/util/Collection;)Z
public static final fun addJsonArray (Lkotlinx/serialization/json/JsonArrayBuilder;Lkotlin/jvm/functions/Function1;)Z
public static final fun addJsonObject (Lkotlinx/serialization/json/JsonArrayBuilder;Lkotlin/jvm/functions/Function1;)Z
public static final fun buildJsonArray (Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/json/JsonArray;
diff --git a/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt b/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt
index b49a1aaa..7a25efdf 100644
--- a/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt
+++ b/formats/json/commonMain/src/kotlinx/serialization/json/JsonElementBuilders.kt
@@ -7,6 +7,7 @@ package kotlinx.serialization.json
import kotlinx.serialization.ExperimentalSerializationApi
import kotlin.contracts.*
+import kotlin.jvm.JvmName
/**
* Builds [JsonObject] with the given [builderAction] builder.
@@ -136,6 +137,15 @@ public class JsonArrayBuilder @PublishedApi internal constructor() {
return true
}
+ /**
+ * Adds the given JSON [elements] to a resulting JSON array.
+ *
+ * @return `true` if the list was changed as the result of the operation.
+ */
+ @ExperimentalSerializationApi
+ public fun addAll(elements: Collection<JsonElement>): Boolean =
+ content.addAll(elements)
+
@PublishedApi
internal fun build(): JsonArray = JsonArray(content)
}
@@ -186,6 +196,35 @@ public fun JsonArrayBuilder.addJsonObject(builderAction: JsonObjectBuilder.() ->
public fun JsonArrayBuilder.addJsonArray(builderAction: JsonArrayBuilder.() -> Unit): Boolean =
add(buildJsonArray(builderAction))
+/**
+ * Adds the given string [values] to a resulting JSON array.
+ *
+ * @return `true` if the list was changed as the result of the operation.
+ */
+@JvmName("addAllStrings")
+@ExperimentalSerializationApi
+public fun JsonArrayBuilder.addAll(values: Collection<String?>): Boolean =
+ addAll(values.map(::JsonPrimitive))
+
+/**
+ * Adds the given boolean [values] to a resulting JSON array.
+ *
+ * @return `true` if the list was changed as the result of the operation.
+ */
+@JvmName("addAllBooleans")
+@ExperimentalSerializationApi
+public fun JsonArrayBuilder.addAll(values: Collection<Boolean?>): Boolean =
+ addAll(values.map(::JsonPrimitive))
+
+/**
+ * Adds the given numeric [values] to a resulting JSON array.
+ *
+ * @return `true` if the list was changed as the result of the operation.
+ */
+@JvmName("addAllNumbers")
+@ExperimentalSerializationApi
+public fun JsonArrayBuilder.addAll(values: Collection<Number?>): Boolean =
+ addAll(values.map(::JsonPrimitive))
@DslMarker
internal annotation class JsonDslMarker