A Scala micro-library for generating type-safe builder for any case class
via annotation.
Add resolver to bintray repo:
resolvers += "pcejrowski maven" at "https://dl.bintray.com/pcejrowski/maven"
and add the following dependency to your build.sbt
.
libraryDependencies += "com.github.pcejrowski" %% "safe-builder" % "0.1.4"
or, if you are using Scala JS or Scala Native:
libraryDependencies += "com.github.pcejrowski" %%% "safe-builder" % "0.1.4"
Finally, enable Macro Paradise:
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full)
Annotate your class with @builder
import safebuilder.annotation.builder
@builder
case class Foo(name: Option[String],
bar: Boolean,
baz: Either[Float, String],
seq: Seq[Int])
and enjoy builder API with compile-time correctness verification.
val foo = Foo()
.withName("my-string")
.barEnabled
.withBaz(.3f)
.withSeq(1, 2, 3)
.build
The library will make sure that all non-optional fields are filled when you invoke build
. Moreover, no field value can be overwritten.
That means, for already defined class Foo
following cases will not compile:
Foo().withName("my-string).barEnabled.build
Foo().withBaz(.3f).build
because required parameters (baz
and bar
, respectively) are not defined.
Following functions are generated depending on the type of the field:
Field name | Type | Functions |
---|---|---|
foo |
A |
withFoo(foo: A) |
foo |
Option[A] |
withFoo(foo: A) |
foo |
Either[A,B] |
withFoo(foo: A) |
withFoo(foo: B) |
||
foo |
Boolean |
fooEnabled |
fooDisabled |
||
foos |
Seq[A] |
withFoos(foos: Seq[A]) |
withFoos(foo: A, foos: A*) |
||
appendFoos(foo: A) |
||
prependFoos(foo: A) |
If there is a default (rhs) value defined for a field (e.g. case class Foo(foo: String = "foo")
,
the invocation of mutator for that field is no longer required and the default value will be used.
Since the default value for Option
is None
by default, this setup will also accept to use Some[_]
as a default value, even though it's considered to be an ambiguous anti-pattern.
Add -Ymacro-debug-lite
flag to scalac
options and generated source code will show up in the console when you compile.
scalacOptions in Compile += "-Ymacro-debug-lite"
Tests are configured to run on all platforms (JVM, JS, Native). Simply invoke sbt "+test"
safe-builder
uses https://github.com/sbt/sbt-release. Simply invoke release
from the root project to release all artifacts.