Skip to content

Commit bde9f1e

Browse files
otobrglezosipxd
andauthored
KTOR-8573 Improvements for "StringValuesBuilder#appendAll" (#4870)
--------- Co-authored-by: Osip Fatkullin <[email protected]>
1 parent 6fdba95 commit bde9f1e

File tree

4 files changed

+84
-1
lines changed

4 files changed

+84
-1
lines changed

ktor-utils/api/ktor-utils.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,10 @@ public class io/ktor/util/StringValuesImpl : io/ktor/util/StringValues {
441441

442442
public final class io/ktor/util/StringValuesKt {
443443
public static final fun appendAll (Lio/ktor/util/StringValuesBuilder;Lio/ktor/util/StringValuesBuilder;)Lio/ktor/util/StringValuesBuilder;
444+
public static final fun appendAll (Lio/ktor/util/StringValuesBuilder;Ljava/util/Map;)Lio/ktor/util/StringValuesBuilder;
445+
public static final fun appendAll (Lio/ktor/util/StringValuesBuilder;[Lkotlin/Pair;)Lio/ktor/util/StringValuesBuilder;
446+
public static final fun appendAllIterable (Lio/ktor/util/StringValuesBuilder;Ljava/util/Map;)Lio/ktor/util/StringValuesBuilder;
447+
public static final fun appendAllIterable (Lio/ktor/util/StringValuesBuilder;[Lkotlin/Pair;)Lio/ktor/util/StringValuesBuilder;
444448
public static final fun appendFiltered (Lio/ktor/util/StringValuesBuilder;Lio/ktor/util/StringValues;ZLkotlin/jvm/functions/Function2;)V
445449
public static synthetic fun appendFiltered$default (Lio/ktor/util/StringValuesBuilder;Lio/ktor/util/StringValues;ZLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
446450
public static final fun appendIfNameAbsent (Lio/ktor/util/StringValuesBuilder;Ljava/lang/String;Ljava/lang/String;)Lio/ktor/util/StringValuesBuilder;

ktor-utils/api/ktor-utils.klib.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,10 @@ final fun (io.ktor.util/StringValues).io.ktor.util/flattenEntries(): kotlin.coll
940940
final fun (io.ktor.util/StringValues).io.ktor.util/flattenForEach(kotlin/Function2<kotlin/String, kotlin/String, kotlin/Unit>) // io.ktor.util/flattenForEach|[email protected](kotlin.Function2<kotlin.String,kotlin.String,kotlin.Unit>){}[0]
941941
final fun (io.ktor.util/StringValues).io.ktor.util/toMap(): kotlin.collections/Map<kotlin/String, kotlin.collections/List<kotlin/String>> // io.ktor.util/toMap|[email protected](){}[0]
942942
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendAll(io.ktor.util/StringValuesBuilder): io.ktor.util/StringValuesBuilder // io.ktor.util/appendAll|[email protected](io.ktor.util.StringValuesBuilder){}[0]
943+
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendAll(kotlin.collections/Map<kotlin/String, kotlin.collections/Iterable<kotlin/String>>): io.ktor.util/StringValuesBuilder // io.ktor.util/appendAll|[email protected](kotlin.collections.Map<kotlin.String,kotlin.collections.Iterable<kotlin.String>>){}[0]
944+
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendAll(kotlin.collections/Map<kotlin/String, kotlin/String>): io.ktor.util/StringValuesBuilder // io.ktor.util/appendAll|[email protected](kotlin.collections.Map<kotlin.String,kotlin.String>){}[0]
945+
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendAll(kotlin/Array<out kotlin/Pair<kotlin/String, kotlin.collections/Iterable<kotlin/String>>>...): io.ktor.util/StringValuesBuilder // io.ktor.util/appendAll|[email protected](kotlin.Array<out|kotlin.Pair<kotlin.String,kotlin.collections.Iterable<kotlin.String>>>...){}[0]
946+
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendAll(kotlin/Array<out kotlin/Pair<kotlin/String, kotlin/String>>...): io.ktor.util/StringValuesBuilder // io.ktor.util/appendAll|[email protected](kotlin.Array<out|kotlin.Pair<kotlin.String,kotlin.String>>...){}[0]
943947
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendFiltered(io.ktor.util/StringValues, kotlin/Boolean = ..., kotlin/Function2<kotlin/String, kotlin/String, kotlin/Boolean>) // io.ktor.util/appendFiltered|[email protected](io.ktor.util.StringValues;kotlin.Boolean;kotlin.Function2<kotlin.String,kotlin.String,kotlin.Boolean>){}[0]
944948
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendIfNameAbsent(kotlin/String, kotlin/String): io.ktor.util/StringValuesBuilder // io.ktor.util/appendIfNameAbsent|[email protected](kotlin.String;kotlin.String){}[0]
945949
final fun (io.ktor.util/StringValuesBuilder).io.ktor.util/appendIfNameAndValueAbsent(kotlin/String, kotlin/String): io.ktor.util/StringValuesBuilder // io.ktor.util/appendIfNameAndValueAbsent|[email protected](kotlin.String;kotlin.String){}[0]

ktor-utils/common/src/io/ktor/util/StringValues.kt

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package io.ktor.util
66

7+
import kotlin.jvm.JvmName
8+
79
/**
810
* Provides data structure for associating a [String] with a [List] of Strings
911
*
@@ -113,8 +115,8 @@ public interface StringValuesBuilder {
113115
public operator fun get(name: String): String?
114116
public fun append(name: String, value: String)
115117
public fun appendAll(stringValues: StringValues)
116-
public fun appendMissing(stringValues: StringValues)
117118
public fun appendAll(name: String, values: Iterable<String>)
119+
public fun appendMissing(stringValues: StringValues)
118120
public fun appendMissing(name: String, values: Iterable<String>)
119121
public fun remove(name: String)
120122
public fun removeKeysWithNoEntries()
@@ -462,6 +464,56 @@ public fun StringValuesBuilder.appendIfNameAndValueAbsent(name: String, value: S
462464
append(name, value)
463465
}
464466

467+
/**
468+
* Appends multiple key-value pairs to this builder
469+
*
470+
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.util.StringValuesBuilder.appendAll)
471+
*
472+
* @param values the key-value pairs to append
473+
* @return this builder instance
474+
*/
475+
public fun StringValuesBuilder.appendAll(vararg values: Pair<String, String>): StringValuesBuilder = apply {
476+
values.forEach { (key, value) -> append(key, value) }
477+
}
478+
479+
/**
480+
* Appends multiple key-value pairs where values are [Iterable] to this builder
481+
*
482+
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.util.StringValuesBuilder.appendAll)
483+
*
484+
* @param values the key-value pairs to append where values are [Iterable] of strings
485+
* @return this builder instance
486+
*/
487+
@JvmName("appendAllIterable")
488+
public fun StringValuesBuilder.appendAll(vararg values: Pair<String, Iterable<String>>): StringValuesBuilder = apply {
489+
values.forEach { (key, value) -> appendAll(key, value) }
490+
}
491+
492+
/**
493+
* Appends multiple key-value pairs from a [Map] where values are [Iterable] to this builder
494+
*
495+
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.util.StringValuesBuilder.appendAll)
496+
*
497+
* @param values the map containing key-value pairs to append where values are [Iterable] of strings
498+
* @return this builder instance
499+
*/
500+
@JvmName("appendAllIterable")
501+
public fun StringValuesBuilder.appendAll(values: Map<String, Iterable<String>>): StringValuesBuilder = apply {
502+
values.forEach { (key, value) -> appendAll(key, value) }
503+
}
504+
505+
/**
506+
* Appends multiple key-value pairs from a [Map] to this builder
507+
*
508+
* [Report a problem](https://ktor.io/feedback/?fqname=io.ktor.util.StringValuesBuilder.appendAll)
509+
*
510+
* @param values the map containing key-value pairs to append
511+
* @return this builder instance
512+
*/
513+
public fun StringValuesBuilder.appendAll(values: Map<String, String>): StringValuesBuilder = apply {
514+
values.forEach { (key, value) -> append(key, value) }
515+
}
516+
465517
private fun entriesEquals(a: Set<Map.Entry<String, List<String>>>, b: Set<Map.Entry<String, List<String>>>): Boolean {
466518
return a == b
467519
}

ktor-utils/common/test/io/ktor/util/StringValuesTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,27 @@ class StringValuesTest {
116116
assertFalse { map.contains("kEy1", "value2") }
117117
assertFalse { map.contains("kEy1", "value3") }
118118
}
119+
120+
@Test
121+
fun appendAllExtensions() {
122+
val map = StringValues.build(true) {
123+
appendAll("foo" to "bar")
124+
appendAll("baz" to listOf("bar", "bor"))
125+
appendAll(mapOf("rar" to listOf("boo", "too")))
126+
appendAll(mapOf("goo" to "boo", "doo" to "dah"))
127+
}
128+
129+
assertTrue { map.contains("foo") }
130+
assertTrue { map.contains("foo", "bar") }
131+
assertTrue { map.contains("baz") }
132+
assertTrue { map.contains("baz", "bar") }
133+
assertTrue { map.contains("baz", "bor") }
134+
assertEquals(listOf("bar", "bor"), map.getAll("baz"))
135+
assertTrue { map.contains("rar") }
136+
assertTrue { map.contains("rar", "boo") }
137+
assertTrue { map.contains("rar", "too") }
138+
assertEquals(listOf("boo", "too"), map.getAll("rar"))
139+
assertTrue { map.contains("goo", "boo") }
140+
assertTrue { map.contains("doo", "dah") }
141+
}
119142
}

0 commit comments

Comments
 (0)