I have just released static-config which is very small library that allows to scrap some boilerplate when working with typesafehub/config. Here you can find motivation for writing it.
Motivation
I tend to use typesafehub/config pretty extensively and in most cases I use it in similarly way: application.conf
in resources + wrapping object for type safe accessing of config entries. Here is small example:
application.conf
my-app {
app-name = "My Fancy App"
kafka {
brokers = ["broker1", "broker2"]
}
http {
interface = "0.0.0.0"
port = 8080
}
}
Config.scala
object Config {
val config = ConfigFactory.load().getConfig("my-app")
val `app-name` = config.getString("app-name")
object kafka {
val config = Config.config.getConfig("kafka")
val brokers = config.getStringList("brokers")
}
object http {
val config = Config.config.getConfig("http")
val interface = config.getString("interface")
val port = config.getInt("port")
}
}
As you can see, Config
code is rather verbose. Every config entry is triplicated(application.conf, name of the variable and argument to the getXY
. Moreover, for each entry we need to specify from which config we want to get our entry. That made me think.
static-config
So I developed this tiny library to scrap (almost) all of this boilerplate. I have to mention it wouldn’t be possible without great lihaoyi/sourcecode.
Here is above example written with static-config.
import com.typesafe.config.{Config, ConfigFactory}
import staticconfig._
object SConfigExample extends SConfig {
override def config: Config = ConfigFactory.load()
object `my-app` extends LocalSConfigNode {
val `app-name` = configEntry(_.getString)
object kafka extends LocalSConfigNode {
val brokers = configEntry(_.getStringList)
}
object http extends LocalSConfigNode {
val interface = configEntry(_.getString)
val port = configEntry(_.getInt)
}
}
}
No boilerplate left! Success! (In fact we could make ConfigFactory.load()
a default implementation of config
but that has some drawbacks. Let’s just act like it is not there.)
How it works?
I didn’t lie, this library has only 6 relevant lines of code. If you’re interested go and read it!