|
1 | 1 | package io.zenwave360.zdl.antlr |
2 | 2 |
|
3 | | -class FluentMap private constructor( |
4 | | - private val backingMap: MutableMap<String, Any?> = linkedMapOf() |
5 | | -) : MutableMap<String, Any?> by backingMap { |
6 | | - |
7 | | - companion object { |
8 | | - fun build(block: FluentMap.() -> Unit = {}): FluentMap = |
9 | | - FluentMap(linkedMapOf()).apply(block) |
10 | | - } |
11 | | - |
12 | | - // Provide access to underlying Java Map (useful for JSONPath on JVM) |
13 | | - fun asJavaMap(): MutableMap<String, Any?> = backingMap |
14 | | - |
15 | | - // Idiomatic API (avoid signature clash with MutableMap.put) |
16 | | - fun putEntry(key: String, value: Any?): FluentMap = apply { backingMap[key] = value } |
17 | | - fun putAllEntries(map: Map<String, Any?>): FluentMap = apply { backingMap.putAll(map) } |
18 | | - |
19 | | - fun appendTo(collection: String, key: String, value: Any?): FluentMap = apply { |
20 | | - val nestedMap = backingMap.getOrPut(collection) { linkedMapOf<String, Any?>() } as MutableMap<String, Any?> |
21 | | - nestedMap[key] = value |
22 | | - } |
23 | | - |
24 | | - fun appendToWithMap(collection: String, map: Map<String, Any?>): FluentMap = apply { |
25 | | - val nestedMap = backingMap.getOrPut(collection) { linkedMapOf<String, Any?>() } as MutableMap<String, Any?> |
26 | | - nestedMap.putAll(map) |
27 | | - } |
28 | | - |
29 | | - fun appendToList(collection: String, value: Any?): FluentMap = apply { |
30 | | - val nestedList = backingMap.getOrPut(collection) { mutableListOf<Any?>() } as MutableList<Any?> |
31 | | - nestedList.add(value) |
32 | | - } |
33 | | - |
34 | | - // Compatibility API (to be refactored later) |
35 | | - fun with(key: String, value: Any?): FluentMap = putEntry(key, value) |
| 3 | +/** |
| 4 | + * Utility functions for building and manipulating MutableMap instances with a fluent API. |
| 5 | + * These replace the previous FluentMap class to avoid ClassCastException issues with Java interop. |
| 6 | + */ |
| 7 | + |
| 8 | +/** |
| 9 | + * Build a new MutableMap with optional initialization block. |
| 10 | + */ |
| 11 | +fun buildMap(block: MutableMap<String, Any?>.() -> Unit = {}): MutableMap<String, Any?> = |
| 12 | + linkedMapOf<String, Any?>().apply(block) |
| 13 | + |
| 14 | +/** |
| 15 | + * Put a key-value pair and return the map for chaining. |
| 16 | + */ |
| 17 | +fun MutableMap<String, Any?>.with(key: String, value: Any?): MutableMap<String, Any?> = |
| 18 | + apply { this[key] = value } |
| 19 | + |
| 20 | +/** |
| 21 | + * Put a key-value pair and return the map for chaining (alias for with). |
| 22 | + */ |
| 23 | +fun MutableMap<String, Any?>.putEntry(key: String, value: Any?): MutableMap<String, Any?> = |
| 24 | + apply { this[key] = value } |
| 25 | + |
| 26 | +/** |
| 27 | + * Put all entries from another map and return the map for chaining. |
| 28 | + */ |
| 29 | +fun MutableMap<String, Any?>.putAllEntries(map: Map<String, Any?>): MutableMap<String, Any?> = |
| 30 | + apply { this.putAll(map) } |
| 31 | + |
| 32 | +/** |
| 33 | + * Append a key-value pair to a nested map within this map. |
| 34 | + * If the collection doesn't exist, it will be created as a LinkedHashMap. |
| 35 | + */ |
| 36 | +fun MutableMap<String, Any?>.appendTo(collection: String, key: String, value: Any?): MutableMap<String, Any?> = apply { |
| 37 | + val nestedMap = this.getOrPut(collection) { linkedMapOf<String, Any?>() } as MutableMap<String, Any?> |
| 38 | + nestedMap[key] = value |
36 | 39 | } |
37 | 40 |
|
| 41 | +/** |
| 42 | + * Append all entries from a map to a nested map within this map. |
| 43 | + * If the collection doesn't exist, it will be created as a LinkedHashMap. |
| 44 | + */ |
| 45 | +fun MutableMap<String, Any?>.appendToWithMap(collection: String, map: Map<String, Any?>): MutableMap<String, Any?> = apply { |
| 46 | + val nestedMap = this.getOrPut(collection) { linkedMapOf<String, Any?>() } as MutableMap<String, Any?> |
| 47 | + nestedMap.putAll(map) |
| 48 | +} |
| 49 | + |
| 50 | +/** |
| 51 | + * Append a value to a nested list within this map. |
| 52 | + * If the collection doesn't exist, it will be created as a MutableList. |
| 53 | + */ |
| 54 | +fun MutableMap<String, Any?>.appendToList(collection: String, value: Any?): MutableMap<String, Any?> = apply { |
| 55 | + val nestedList = this.getOrPut(collection) { mutableListOf<Any?>() } as MutableList<Any?> |
| 56 | + nestedList.add(value) |
| 57 | +} |
| 58 | + |
| 59 | +/** |
| 60 | + * Returns this map (useful for Java interop compatibility). |
| 61 | + * Previously used to unwrap FluentMap to underlying map. |
| 62 | + */ |
| 63 | +fun MutableMap<String, Any?>.asJavaMap(): MutableMap<String, Any?> = this |
| 64 | + |
0 commit comments