Chciałbym przeczytać poniższą konfigurację z pliku HOCON (Typesafe Config) do Kotlin.Czytanie i przetwarzanie HOCON w 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 } }
]
}
W rzeczywistości chciałbym wyodrębnić kluczowe kolumny (y). Próbowałem do tej pory następujące.
val metadata = ConfigFactory.parseFile(metafile)
val keys = metadata.getObjectList("${tablename.toLowerCase()}.columns")
.filter { it.unwrapped().values.first().get("key") == true }
Ale zawiedzie z następującym błędem.
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
Jest oczywiste, że Kotlin nie jest w stanie zrozumieć typu danych pola "wartości" na mapie. Jak mogę to zgłosić lub powiadomić Kotlin?
Nie ma również różnych typów i opcjonalnych kluczy na tej mapie.
PS: Wiem, że dla Kotlina dostępnych jest kilka owijaczy, takich jak Konfig i Klutter. Miałem nadzieję, że jeśli to będzie łatwe do napisania, mogę uniknąć kolejnej biblioteki.
UPDATE 1:
Próbowałem następujące.
it.unwrapped().values.first().get<String, Boolean>("key")
Aby uzyskać następujący błąd kompilatora.
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
I to
it.unwrapped().values.first().get<String, Boolean?>("key")
z wyjściem
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:
Patrząc na sposób, w jaki jest obsługiwany gdzie indziej, myślę, że prawdopodobnie trzeba użyć odbicie. Próbuję tego z moją ograniczoną ekspozycją. Do tej pory nie było szczęścia.
Prawdopodobnie nie trzeba odwijać obiektu konfiguracyjnego. Ale radzenie sobie z nim tak, jak jest, nie przyniosło żadnych rezultatów i było to najbliżej, jakie mogłem przynieść, aby "wydrukować" coś. –