我有这样的切入点:
def main(args: Array[String]): Unit = {
pureconfig.loadConfig[Conf] match {
case Right(conf) => doStuff(conf)
case Left(fail) => lectureUserAboutStuff(fail)
}
}
所以看起来我的程序的主要目的是加载配置,这不是真的,我的程序的核心是doStuff
。
如何明确地表示这一点并隐藏秘密配置?
我想要这样的事情:
def main(args: Array[String]): Unit = {
doStuff(conf)(failHandler)
}
其中很清楚,故障处理和配置加载只是附件。
答案 0 :(得分:1)
从程序的main
方法中使用PureConfig的最常用方法之一是在出错时快速失败。 API提供loadConfigOrThrow
,如果加载成功则返回配置,否则抛出ConfigReaderException
:
import pureconfig.loadConfigOrThrow
def main(args: Array[String]): Unit = {
val conf = loadConfigOrThrow[Conf] // will throw if Conf cannot be loaded
doStuff(conf)
}
pureconfig.loadConfig
返回Either
的原因是因为
加载配置可能会失败。 Either
模拟了失败
案例,Left
,成功案例Right
。这是
适合图书馆,因为你永远不知道loadConfig
将被调用,因此你不想抛出一个
例外。虽然这是正确的,但loadConfig
是
从“表面”方法中使用,例如, main
,抛出异常或
只是在配置加载失败的情况下退出是有意义的
这就是pureconfig提供loadConfigOrThrow
。
如果您不喜欢抛出异常或者您更喜欢自定义
失败处理程序,如lectureUserAboutStuff
,您可以创建一个
助手:
def loadConfig(): Option[Conf] = {
val errorOrConf = pureconfig.loadConfig[Conf]
errorOrConf.left.foreach(lectureUserAboutStuff)
errorOrConf.toOption
}
def main(args: Array[String]): Unit =
loadConfig().foreach(doStuff)
要记住的最后一件事是这个问题的一个小问题
代码是应用程序的退出代码不受影响
配置失败。如果要为何时设置退出代码
无法加载配置,然后将main
更改为
val configReaderFailureErrorCode = 42
private def configFailureExit() =
sys.exit(configReaderFailureErrorCode)
def main(args: Array[String]): Unit =
loadConfig().fold(configFailureExit())(doStuff)