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.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
notes Post note of v0.3.6 Nov 22, 2016
project
src Merge pull request #18 from lustefaniak/scala-2.12-cross-build Nov 22, 2016
.gitignore
.travis.yml
LICENSE
README.md Fix travis.ci links. Jun 19, 2017
build.sbt
deploy.sbt.disabled
version.sbt Setting version to 0.3.7-SNAPSHOT Nov 22, 2016

README.md

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.

Usage

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 = "wacai.com"
    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(
    server.host,
    server.port,
    socket.timeout,
    socket.buffer,
    client
  )

  ...
}

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

trait kafka {
  val server = new {
    val host = config.getString("kafka.server.host")
    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 = wacai.com
    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"

Installation

Caution: only support scala 2.11.0+

Set up your project/build.properties 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.