ScalaConfig is a lightweight wrapper over Typesafe Lightbend Config library provides scala friendly access.
It is implemented with type classes pattern and use shapeless for reading case classes.
Current documentation is a actual for 0.7 version.
ScalaConfig adds additional metods:
as[A](path)- returnEither[Seq[Throwable], A]by path in config objectas[A]- convert config object toEither[Seq[Throwable], A]asUnsafe[A](path)- return value of typeAby path in config object. On fail a first exception will thrown.asUnsafe[A]- convert config object to value of typeA. On fail a first exception will thrown.
- Primitive (
Int,Long,Float,Double,Boolean) String,Symbol- Typesafe
ConfigandConfigValue FiniteDurationProperties- Collections (
List[A],Set[A],Map[String, A],Map[String, AnyRef],Array[A], etc. All types with a CanBuildFrom instance are supported) Option[A]- Case classes
import com.github.andr83.scalaconfig._
val config: Config = ConfigFactory.load()
val host = config.asUnsafe[String]("host")
val port = config.asUnsafe[Int]("port")
val path = config.asUnsafe[Option[String]]("path")
val users = config.asUnsafe[List[String]]("access.users")
case class DbConfig(host: String, port: Int, user: Option[String] = None, passwd: Option[String] = None)
val dbConfig: Reader.Result[DbConfig] = config.as[DbConfig]("db")
val dbConfig2: Reader.Result[DbConfig] = config.as[DbConfig] // Direct `config` mapping to case class
val dbConfig3: Reader.Result[Map[String, String]] = config.as[Map[String, String]]
val dbConfig3: Reader.Result[Map[String, AnyRef]]] = config.as[Map[String, AnyRef]]
// Custom reader
class User(name: String, password: String)
implicit def userReader: Reader[User] = Reader.pure((config: Config, path: String) => {
val userConfig = config.getConfig(path)
new User(
user = userConfig.asUnsafe[String]("name"),
password = userConfig.asUnsafe[String]("password")
)
}
})
// OR
implicit def userReader: Reader[User] = Reader.pureV((config: Config, path: String) => {
val userConfig = config.getConfig(path)
val userE = userConfig.as[String]("name")
val passwordE = userConfig.as[String]("password")
// with Cats or Scalaz it can be of course more elegant!
(userE, passwordE) match {
case (Right(user), Right(password)) => Right(new User(user, password))
case ( Left(errors1), Left(errors2)) => Left(errors1 ++ errors2)
case (Left(errors), _) => Left(errors)
case (_, Left(errors)) => Left(errors)
}
}
})
// for >= Scala 2.11.x, 2.12.x, 2.13.x
libraryDependencies += "com.github.andr83" %% "scalaconfig" % "0.7"If you want scala 2.10 support please use 0.4 version.
resolvers += Resolver.sonatypeRepo("snapshots")
libraryDependencies += "com.github.andr83" %% "scalaconfig" % "0.8-SNAPSHOT"MIT License
Copyright (c) 2016 Andrei Tupitcyn