L'un des moyens les plus courants d'utiliser PureConfig à partir de la méthode main
de votre programme consiste à échouer rapidement en cas d'erreur. L'API fournit loadConfigOrThrow
qui retourne la configuration si le chargement a été un succès et jette un ConfigReaderException
autrement:
import pureconfig.loadConfigOrThrow
def main(args: Array[String]): Unit = {
val conf = loadConfigOrThrow[Conf] // will throw if Conf cannot be loaded
doStuff(conf)
}
La raison pour laquelle pureconfig.loadConfig
retourne un Either
est parce que configuration de chargement peut échouer. Either
modèles à la fois l'échec cas, avec Left
, et le cas de succès, avec Right
. C'est bon pour une bibliothèque, parce que vous ne savez jamais où loadConfig
sera appelé et par conséquent vous ne voulez pas jeter une exception . Bien que ceci soit vrai en général, lorsque loadConfig
est utilisé à partir d'un procédé de "surface", par ex. main
, en levant l'exception ou juste en sortant en cas d'échec de chargement de configuration est logique et c'est pourquoi pureconfig fournit loadConfigOrThrow
.
Si vous ne voulez pas jeter exception ou si vous préférez un gestionnaire d'échec personnalisée , comme lectureUserAboutStuff
, vous pouvez créer une aide :
def loadConfig(): Option[Conf] = {
val errorOrConf = pureconfig.loadConfig[Conf]
errorOrConf.left.foreach(lectureUserAboutStuff)
errorOrConf.toOption
}
def main(args: Array[String]): Unit =
loadConfig().foreach(doStuff)
Une dernière chose à garder à l'esprit est qu'un mineur problème avec ce code est que le code de sortie de l'application n'est pas affectée par échecs de configuration. Si vous souhaitez définir un code de sortie lorsque la configuration ne peut pas être chargé, puis changer main
à
val configReaderFailureErrorCode = 42
private def configFailureExit() =
sys.exit(configReaderFailureErrorCode)
def main(args: Array[String]): Unit =
loadConfig().fold(configFailureExit())(doStuff)
Je dirais que tout becase vous appelez 'pureconfig.loadConfig' d'abord, cela signifie que c'est le but principal de votre programme. – mfirry