La configuration dans un projet est un élément récurrent.

Le principe est toujours le même quels que soient les projets, des valeurs que l’on souhaite pouvoir modifier sans avoir à retoucher à son code. Avec le temps, le mécanisme c’est standardisé afin de simplifier la problématique. Actuellement sur un projet Scala pour gérer et accéder à la configuration depuis le code on met généralement en place un ‘object’ qui va représenter la structure du fichier de conf (qui est généralement décrit au format JSON).

Cette approche est intéressante mais nécessite un peu d’huile de coude à mettre en place. Ce n’est pas ingérable mais il existe un moyen d’éliminer ce boilerplate. Pour cela, il peut être intéressant de regarder du coté de la librairie : PureConfig.

Cette librairie, écrite en Scala, apporte une vraie valeur ajoutée.

Le principal intérêt va être de faire le mapping automatique d’un fichier de conf sur une case class. afin de permettre de résumer le chargement du fichier de configuration à ce statement :

ConfigSource.default.load[ServiceConf]

ServiceConf étant une simple case class (exemple ici de la documentation)

case class Port(number: Int) extends AnyVal
sealed trait AuthMethod
case class Login(username: String, password: String) extends AuthMethod
case class Token(token: String) extends AuthMethod
case class PrivateKey(pkFile: java.io.File) extends AuthMethod
case class ServiceConf(
host: String,
port: Port,
useHttps: Boolean,
authMethods: List[AuthMethod])

Le fichier de conf correspondant :

host = "example.com"
port = 8080
use-https = true
auth-methods = [
{ type = "private-key", pk-file = "/home/user/myauthkey" },
{ type = "login", username = "pureconfig", password = "12345678" }
]

PureConfig va être capable, automatique par un mécanisme de dérivation de construire une instance de la case class à partir du fichier de conf.

Cela présente plusieurs avantages :

 – Limiter le ligne de code technique pour se concentrer sur la cible,
– De s’assurer typer explicitement chaque variable.
– Maintenir la configuration dans le temps.

Lors du chargement de la configuration, on peut récupérer l’instance au sein d’un Either afin de gérer les éventuels problèmes de chargement. Par défaut, PureConfig est capable de gérer tous les types basiques (fourniture des typeclass nécessaires), mais il est évidemment possible d’écrire ses propres readers afin d’adresser des cas spécifiques. On retrouve la logique du parser Json de play.

PureConfig support les standards telsque HOCON et autres. Cette librairie adresse la problématique de manière élégante. vous trouverez plus de détails ici sur les autres features de la librairie.