Skip to content
A refactor-friendly way to use typesafe's config by scala macro annotation
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
notes Post note of v0.3.6 Nov 22, 2016
src Merge pull request #18 from lustefaniak/scala-2.12-cross-build Nov 22, 2016
LICENSE Fix links. Jun 19, 2017
version.sbt Setting version to 0.3.7-SNAPSHOT Nov 22, 2016

Config annotation

Build Status Codacy Badge

A refactor-friendly configuration lib would help scala programmers to maintain config files without any pain, by using scala macro annotation.


Create a config-style trait as configuration definition, eg:

import com.wacai.config.annotation._
import scala.concurrent.duration._

@conf trait kafka {
  val server = new {
    val host = ""
    val port = 12306

  val socket = new {
    val timeout = 3 seconds
    val buffer = 1024 * 64L

  val client = "wacai"

Use config by extending it,

class Consumer extends kafka {
  val client = new SimpleConsumer(,


Compile, @conf will let scala compiler to insert codes to kafka.scala:

trait kafka {
  val server = new {
    val host = config.getString("")
    val port = config.getInt("kafka.server.port")
  val socket = new {
    val timeout = Duration(config.getDuration("kafka.socket.timeout", SECONDS))
    val buffer = config.getBytes("kafka.socket.buffer")
  val client = config.getString("kafka.client")


After that, a config file named kafka.conf was generated at src/main/resources as blow:

kafka {
  server {
    host =
    port = 12306

  socket {
    timeout = 3s
    buffer = 64K

  client = wacai

Last but not least, a application.conf need to be created to include kafka.conf like:

include "kafka.conf"


Caution: only support scala 2.11.0+

Set up your project/ to:

sbt.version = 0.13.13

Set up your build.sbt with:

addCompilerPlugin("org.scalamacros" % "paradise" % "2.0.1" cross CrossVersion.full)

libraryDependencies += "com.wacai" %% "config-annotation" % "0.3.5"

v0.3.6 for scala 2.12.0+

Type covenant

Scala type Config getter Value
Boolean getBoolean true/false
Int getInt number
Double getDouble float
String getString text
Long getBytes number with unit (B, K, M, G)
+Duration getDuration number with unit (ns, us, ms, s, m, h, d)

Integrate with akka actor

import com.wacai.config.annotation._

@conf trait kafka extends Configurable { self: Actor =>
  def config = context.system.settings.config


Change default generation directory

Config files would be generated at src/main/resources as default.

It can be changed by appending macro setting to scalacOption in build.sbt:

scalacOptions += "-Xmacro-settings:conf.output.dir=/path/to/out"

A runnable example

Please see config-annotation-example.

You can’t perform that action at this time.