Using with ZIO 1.x
To use the ZIO interface add the following dependency:
libraryDependencies += "io.github.vigoo" %% "clipp-zio" % "0.6.3"
It is possible to directly call the ZIO interface wrapper, for example:
import io.github.vigoo.clipp._
import io.github.vigoo.clipp.parsers._
import io.github.vigoo.clipp.syntax._
import io.github.vigoo.clipp.zioapi._
import zio._
object Test1 extends zio.App {
override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = {
val paramSpec = for {
_ <- metadata("zio-test")
x <- flag("test parameter", 'x')
} yield x
Clipp.parseOrDisplayUsageInfo(args, paramSpec, ExitCode.failure) { x =>
console.putStrLn(s"x was: $x").ignore.as(ExitCode.success)
}.catchAll { _: ParserFailure => ZIO.succeed(ExitCode.failure) }
}
}
An even better alternative is to construct a ZLayer
from the parameters:
import io.github.vigoo.clipp._
import io.github.vigoo.clipp.parsers._
import io.github.vigoo.clipp.syntax._
import io.github.vigoo.clipp.zioapi._
import zio._
object Test2 extends zio.App {
override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = {
val paramSpec = for {
_ <- metadata("zio-test")
x <- flag("test parameter", 'x')
} yield x
val clippConfig = parametersFromArgs(args, paramSpec).printUsageInfoOnFailure
val program = for {
x <- parameters[Boolean]
_ <- console.putStrLn(s"x was: $x").ignore
} yield ExitCode.success
program
.provideSomeLayer(clippConfig)
.catchAll { _: ParserFailure => ZIO.succeed(ExitCode.failure) }
}
}
There is support for lifting ZIO effects with arbitrary environment requirements into the parameter parser.
To use that, you either have to have an implicit ZIO Runtime
or use the effectfulParametersFromArgs
layer
constructor:
import zio.clock._
effectfulParametersFromArgs[Clock, String](List.empty) { p =>
p.liftURIO("the current instant", "2021-03-12T12:13:12Z") {
instant.map(_.toString)
}
}
// res0: ZLayer[console.package.Console with Clock, ParserFailure, Has[String]] = Managed(
// self = zio.ZManaged$$anon$2@7b79e63d
// )
Using with ZIO 2.x
ZIO 2 support is currently published separately for snapshot versions of ZIO. Once ZIO 2 is released there will be only one clipp-zio artifact maintained.
libraryDependencies += "io.github.vigoo" %% "clipp-zio-2" % "0.6.3"
The only difference currently is that instead of providing the list of arguments as a parameter, Clipp takes it from the
ZIOAppArgs
layer:
import io.github.vigoo.clipp._
import io.github.vigoo.clipp.parsers._
import io.github.vigoo.clipp.syntax._
import io.github.vigoo.clipp.zioapi._
import zio._
object Test2 extends ZIOApp {
def run = {
val paramSpec = for {
_ <- metadata("zio-test")
x <- flag("test parameter", 'x')
} yield x
val clippConfig = parametersFromArgs(paramSpec).printUsageInfoOnFailure
val program = for {
x <- parameters[Boolean]
_ <- console.putStrLn(s"x was: $x").ignore
} yield ExitCode.success
program
.injectCustom(clippConfig)
.catchAll { _: ParserFailure => ZIO.succeed(ExitCode.failure) }
}
}