package link.roadio.riff.config /** Canonical object ordering is for transport/identity, never discovery precedence. */ internal fun configurationJson(value: Any): String = when (value) { is Map<*, *> -> { value.entries.sortedBy { it.key as String }.joinToString(",", "{", "}") { configurationJson(it.key as String) + ":" + configurationJson(checkNotNull(it.value)) } } is List<*> -> { value.joinToString(",", "[", "]") { configurationJson(checkNotNull(it)) } } is String -> { buildString { append('"') value.forEach { c -> when (c) { '"' -> append("\\\"") '\\' -> append("\\\\") else -> if (c.code < 32) append("\\u" + c.code.toString(16).padStart(4, '0')) else append(c) } } append('"') } } is Boolean, is Number -> { value.toString() } else -> { error("Unsupported configuration value") } }