Config for Kotlin.
Config4k is a lightweight Typesafe Config wrapper for Kotlin and inspired by ficus, providing simple extension functions Config.extract<T> and Any.toConfig to convert between Config and Kotlin Objects.
Gradle:
repositories {
mavenCentral()
}
dependencies {
compile 'io.github.config4k:config4k:xxx' // See the `Download` badge
}By far the simplest way to use config4k is via Kotlin Delegated Properties:
val config = ConfigFactory.parseString("""
|stringValue = hello
|booleanValue = true
|""".trimMargin())
val stringValue: String by config
println(stringValue) // hello
val nullableStringValue: String? by config
println(nullableStringValue) // null
val booleanValue: Boolean by config
println(booleanValue) // trueConfig.extract<T> converts Config to T.
Maps can be serialized with String keys
val config = ConfigFactory.parseString("""
|map {
| foo = 5
| bar = 6
|}""".trimMargin())
val map: Map<String, Int> = config.extract<Map<String, Int>>("map")
println(map["foo"] == 5) // true
println(map["bar"] == 6) // trueor with arbitrary keys
val config = ConfigFactory.parseString("""
|map = [{
| key = 5
| value = "foo"
|}
|{
| key = 6
| value = "bar"
|}]""".trimMargin())
val map: Map<Int, String> = config.extract<Map<Int, String>>("map")
println(map[5] == "foo") // true
println(map[6] == "bar") // trueTest Class: TestMap.kt
Config4k has no option to use different names between code and config file.
data class Person(val name: String, val age: Int)
val config = ConfigFactory.parseString("""
|key {
| name = "foo"
| age = 20
|}""".trimMargin())
val person: Person = config.extract<Person>("key")
println(person.name == "foo") // true
println(person.age == 20) // trueFor more details, please see TestArbitraryType.kt
Using extract<T?> is the better way than Config.hasPath().
extract<T?> returns T when the path exists and null when it does not exist.
val config = ConfigFactory.parseString("""key = 10""")
val key = config.extract<Int?>("key")
val foo = config.extract<Int?>("foo")
println(key == 10) // true
println(foo == null) // trueTest Class: TestNullable.kt
Config4k also supports Enum. Enum is converted to String of its name in the config file.
enum class Size {
SMALL,
MEDIUM,
LARGE
}
val config = ConfigFactory.parseString("""key = SMALL""")
val small = config.extract<Size>("key")
println(small == Size.SMALL) // trueTest Class: TestEnum.kt
Any.toConfig converts the receiver object to Config.
You can use ConfigValue.render() to serialize Config. Config4k helps getting Config of the class you want to serialize.
data class Person(val name: String, val age: Int)
val person = Person("foo", 20).toConfig("person")
println(person.root().render())Output:
{
# hardcoded value
"person" : {
# hardcoded value
"age" : 20,
# hardcoded value
"name" : "foo"
}
}
Test Class: TestToConfigForArbitraryType.kt
Typesafe Config's class ConfigRenderOptions is the argument of ConfigValue.render.
// If setJson(false) is called, ConfigValue.render returns HOCON
data class Person(val name: String, val age: Int)
val person = Person("foo", 20).toConfig("person")
val options = ConfigRenderOptions.defaults().setJson(false)
println(person.root().render(options))Output:
# hardcoded value
person {
# hardcoded value
age=20
# hardcoded value
name=foo
}
// setOriginComments(false) removes comments
data class Person(val name: String, val age: Int)
val person = Person("foo", 20).toConfig("person")
val options = ConfigRenderOptions.defaults()
.setJson(false)
.setOriginComments(false)
println(person.root().render(options))Output:
person {
age=20
name=foo
}
Property delegation, extract and toConfig support these types:
- Primitive types
BooleanByteIntLongFloatDouble
Stringimport java.io.Fileimport java.nio.file.Pathjava.time.Durationjava.time.Periodjava.time.temporal.TemporalAmountkotlin.text.Regex- Collections
ListSetMap<K, V>Array<T>(You can useArray<Int>, but can't useArray<Array<Int>>)
- Nullable
T? - Typesafe Config classes(Calling
toConfigis meaningless)com.typesafe.config.Configcom.typesafe.config.ConfigValuecom.typesafe.config.ConfigMemorySize
- Enum
- Data classes
See SelectReader.kt for the exhaustive list.
All snapshot artifacts are available in the Sonatype snapshots repository.
Would you like to contribute to Config4k?
Take a look at CONTRIBUTING.md
