Defining Property Keys - npryce/konfig GitHub Wiki

"Magic" Configuration Keys

Property keys can be defined by delegated properties that delegate to a property type. This lets you refer to them with the same names in code and property files.

Simple Property Keys

Simple "magic" keys can be defined as vals at package scope. For example:

val port by intType
val service by uriType

Keys defined this way are named after the property. In a properties file, these keys would be used like:

port=8080
service=http://backend.example.com/service

Any underscores in the property name are converted to hyphens in the key name, so the following declaration defines a key named web-service:

val web_service by uriType

Property Groups

The PropertyGroup abstract class lets you group related configuration keys and refer to them with the same syntax in code and property files.

Define groups of property keys by deriving objects from PropertyGroup that have read-only properties (vals) of the object that delegate to a property type.

For example, the following declaration defines three properties, a URI property named database.uri and two string properties named database.username and database.password.

object database : PropertyGroup() {
    val uri by uriType
    val username by stringType
    val password by stringType
}

To read the properties defined above from a Configuration object:

val config : Configuration = loadConfigurationSomehow()

val datasource = ExampleDataSource().apply {
    uri = config[database.uri]
    username = config[database.username]
    password = config[database.password]
}

Keys are referred to by the same name in both code and property files. For example, in a properties file:

database.uri=snarl://rdf.example.com/
database.username=admin
database.password=SDE!DR0923D

The Key Class

If necessary you can define a property keys directly by instantiating the Key class. The constructor takes the name and property type as parameters.

val server_port = Key("server.port", intType)