Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/hanabix/config-annotation
A refactor-friendly way to use typesafe's config by scala macro annotation
https://github.com/hanabix/config-annotation
scala
Last synced: about 5 hours ago
JSON representation
A refactor-friendly way to use typesafe's config by scala macro annotation
- Host: GitHub
- URL: https://github.com/hanabix/config-annotation
- Owner: hanabix
- License: apache-2.0
- Created: 2015-01-16T07:20:38.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2023-11-28T08:20:12.000Z (11 months ago)
- Last Synced: 2023-11-29T07:39:07.029Z (11 months ago)
- Topics: scala
- Language: Scala
- Homepage: https://zhongl.github.io/2015/01/17/implement-configuration-binding-with-scala-macro-1/
- Size: 163 KB
- Stars: 105
- Watchers: 7
- Forks: 12
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[![CI](https://github.com/hanabix/config-annotation/actions/workflows/sbt-coverage.yml/badge.svg)](https://github.com/hanabix/config-annotation/actions/workflows/sbt-coverage.yml) [![Publish](https://github.com/hanabix/config-annotation/actions/workflows/sbt-release.yml/badge.svg)](https://github.com/hanabix/config-annotation/actions/workflows/sbt-release.yml) [![Maven Central](https://img.shields.io/maven-central/v/com.wacai/config-annotation_2.13)](https://search.maven.org/artifact/com.wacai/config-annotation_2.13) [![Coverage Status](https://coveralls.io/repos/github/hanabix/config-annotation/badge.svg)](https://coveralls.io/github/hanabix/config-annotation) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/ba5b0f3a2107473fbb756e8eabfcbc26)](https://www.codacy.com/gh/hanabix/config-annotation/dashboard?utm_source=github.com&utm_medium=referral&utm_content=hanabix/config-annotation&utm_campaign=Badge_Grade)
A refactor-friendly configuration lib would help scala programmers to maintain [config][conf] files without any pain,
by using scala [macro annotation][mcr].## Usage
Create a config-style trait as configuration definition, eg:
```scala
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,
```scala
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`:
```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
```scala
addCompilerPlugin("org.scalamacros" % "paradise" % "2.0.1" cross CrossVersion.full)libraryDependencies += "com.wacai" %% "config-annotation" % "0.3.5"
```### Scala 2.12
```scala
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)libraryDependencies += "com.wacai" %% "config-annotation" % "0.3.6"
```### Scala 2.13
```scala
libraryDependencies += "com.wacai" %% "config-annotation" % "0.4.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
```scala
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`:
```scala
scalacOptions += "-Xmacro-settings:conf.output.dir=/path/to/out"
```## A runnable example
Please see [config-annotation-example][cae].
[mcr]:http://docs.scala-lang.org/overviews/macros/annotations.html
[conf]:https://github.com/typesafehub/config
[cae]:https://github.com/wacai/config-annotation-example