Vorrei leggere la seguente configurazione da un file HOCON (Typesafe Config) in Kotlin.Lettura ed elaborazione di HOCON in Kotlin
tablename: {
columns: [
{ item: { type: integer, key: true, null: false } }
{ desc: { type: varchar, length: 64 } }
{ quantity: { type: integer, null: false } }
{ price: { type: decimal, precision: 14, scale: 3 } }
]
}
In effetti vorrei estrarre la colonna chiave (s). Ho provato quanto segue finora.
val metadata = ConfigFactory.parseFile(metafile)
val keys = metadata.getObjectList("${tablename.toLowerCase()}.columns")
.filter { it.unwrapped().values.first().get("key") == true }
Ma non riesce con il seguente errore.
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, ???>.get(key: kotlin.String): ??? defined in kotlin.collections
È chiaro che Kotlin non è in grado di comprendere il tipo di dati del campo "valore" nella Mappa. Come posso dichiararlo o far sapere a Kotlin?
Inoltre, non ci sono diversi tipi e chiavi opzionali in questa mappa.
PS: So che ci sono un paio di wrapper disponibili per Kotlin come Konfig e Klutter. Speravo che se fosse facile scrivere potrei evitare un'altra libreria.
UPDATE 1:
Ho provato quanto segue.
it.unwrapped().values.first().get<String, Boolean>("key")
per ottenere il seguente errore del compilatore.
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, kotlin.Boolean>.get(key: kotlin.String): kotlin.Boolean? defined in kotlin.collections
E questo
it.unwrapped().values.first().get<String, Boolean?>("key")
con uscita
Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@kotlin.internal.InlineOnly public operator inline fun <@kotlin.internal.OnlyInputTypes K, V> kotlin.collections.Map<out kotlin.String, kotlin.Boolean?>.get(key: kotlin.String): kotlin.Boolean? defined in kotlin.collections
UPDATE 2:
Guardando il modo in cui viene gestita altrove, immagino probabilmente ho bisogno di usare riflessione. Provando con la mia esposizione limitata. Nessuna fortuna finora.
Probabilmente non ho bisogno di scartare l'oggetto config. Ma occuparsene non ha dato alcun risultato e questo è stato il più vicino possibile per "stampare" qualcosa. –