scala
libraryDependencies += "com.github.scopt" %% "scopt" % "4.0.0"
scala
case class Config(inputFile: String = "", outputFile: String = "", verbose: Boolean = false)
scala
val parser = new scopt.OptionParser[Config]("myapp") {
head("myapp", "1.0")
opt[String]('i', "inputFile").required().valueName("<file>").action((x, c) => c.copy(inputFile = x))
.text("input file is required")
opt[String]('o', "outputFile").required().valueName("<file>").action((x, c) => c.copy(outputFile = x))
.text("output file is required")
opt[Unit]('v', "verbose").action((_, c) => c.copy(verbose = true))
.text("enable verbose output")
}
scala
parser.parse(args, Config()) match {
case Some(config) =>
case None =>
}
scala
def parseCommandLine(args: Array[String]): Option[Config] = {
parser.parse(args, Config())
}
scala
def validateConfig(config: Config): Either[String, Config] = {
if (config.inputFile.isEmpty) {
Left("Input file is required.")
} else if (!new File(config.inputFile).exists()) {
Left("Input file does not exist.")
} else {
Right(config)
}
}
parser.parse(args, Config()) match {
case Some(config) =>
validateConfig(config) match {
case Left(error) =>
println(s"Error: $error")
case Right(validatedConfig) =>
}
case None =>
}
scala
val parser = new scopt.OptionParser[Config]("myapp") {
head("myapp", "1.0")
opt[String]('i', "inputFile").required().valueName("<file>")
.action((x, c) => c.copy(inputFile = x))
.text("input file is required")
opt[String]('o', "outputFile").required().valueName("<file>")
.action((x, c) => c.copy(outputFile = x))
.text("output file is required")
opt[Unit]('v', "verbose").action((_, c) => c.copy(verbose = true))
.text("enable verbose output")
mutuallyExclusive(opt[String]("mode").action((x, c) => c.copy(mode = x)),
opt[Unit]("mode-a").action((_, c) => c.copy(mode = "a")).text("mode a"),
opt[Unit]("mode-b").action((_, c) => c.copy(mode = "b")).text("mode b"))
}