zhongl/config-annotation

A refactor-friendly way to use typesafe's config by scala macro annotation

104

stars

215

commits

Scala

primary language

Sep 9, 2024

updated

scala

README

CI Publish Maven Central Coverage 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 build.sbt with:

Scala 2.11

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

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

Scala 2.12

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

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

Scala 2.13

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

Type covenant

Scala typeConfig getterValue
BooleangetBooleantrue/false
IntgetIntnumber
DoublegetDoublefloat
StringgetStringtext
LonggetBytesnumber with unit (B, K, M, G)
+DurationgetDurationnumber 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.

Contributors

zhongl

201 commits

lustefaniak

9 commits

eagoo

3 commits

orrsella

1 commits

zhongl/config-annotation

A refactor-friendly way to use typesafe's config by scala macro annotation

104

stars

215

commits

Scala

primary language

Sep 9, 2024

updated

scala

README

CI Publish Maven Central Coverage 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 build.sbt with:

Scala 2.11

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

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

Scala 2.12

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

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

Scala 2.13

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

Type covenant

Scala typeConfig getterValue
BooleangetBooleantrue/false
IntgetIntnumber
DoublegetDoublefloat
StringgetStringtext
LonggetBytesnumber with unit (B, K, M, G)
+DurationgetDurationnumber 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.

Contributors

zhongl

201 commits

lustefaniak

9 commits

eagoo

3 commits

orrsella

1 commits

Languages

Scala

100.0%