Example
deploy
A realistic deployment command with validation, repeatable labels, and generated help.
In the terminal
$ ./deploy ghcr.io/acme/api:v2 --environment production --replicas 4 --label team=payments --label tier=api --dry-run
Deployment plan:
{ dry_run: True, environment: "production", labels: ["team=payments", "tier=api"], region: "us-east-1", replicas: 4, target_image: "ghcr.io/acme/api:v2" }
Source
app [main!] {
pf: platform "https://github.com/lukewilliamboswell/roc-platform-template-zig/releases/download/1.0.0/AnZoxzoGPtSGQ15EQh6pBeeaHJ7aizP9MQhK81dES3Uq.tar.zst",
weaver: "../package/main.roc",
}
import pf.Stdout
import weaver.Cli
import weaver.Opt
import weaver.Param
# capture:start
DeployConfig : {
dry_run : Bool,
environment : Str,
labels : List(Str),
region : Str,
replicas : U64,
target_image : Str,
}
deploy_fields = {
dry_run: Opt.flag(dry_run_option),
environment: Opt.str(environment_option),
labels: Opt.str_list(label_option),
region: Opt.str(region_option),
replicas: Opt.u64(replicas_option),
target_image: Param.str(image_parameter),
}.Cli
# capture:end
main! : List(Str) => Try({}, _)
main! = |args|
match Cli.parse_or_display_message(cli_parser, args.drop_first(1), str_to_raw_arg) {
Err(Help(message)) | Err(Version(message)) => Stdout.line!(message)
Err(InvalidUsage(message)) => {
Stdout.line!(message)?
Err(Exit(1))
}
Ok(config) => {
Stdout.line!("Deployment plan:")?
Stdout.line!(Str.inspect(config))
}
}
cli_parser : Cli.CliParser(DeployConfig)
cli_parser =
Cli.assert_valid(
Cli.finish(
deploy_fields,
{
name: "deploy",
version: "v0.1.0",
authors: ["Acme Platform Team <platform@example.com>"],
description: "Roll out a container image to one deployment environment.",
text_style: Color,
},
),
)
dry_run_option = {
short: "n",
long: "dry-run",
help: "Print the deployment plan without applying it.",
}
environment_option = {
short: "e",
long: "environment",
help: "Target environment, such as staging or production.",
default: NoDefault,
}
image_parameter = {
name: "image",
help: "Container image and tag to deploy.",
default: NoDefault,
}
label_option = {
short: "l",
long: "label",
help: "Attach a repeatable KEY=VALUE label.",
}
region_option = {
short: "",
long: "region",
help: "Cloud region. [default: us-east-1]",
default: Value("us-east-1"),
}
replicas_option = {
short: "r",
long: "replicas",
help: "Number of service replicas. [default: 3]",
default: Value(3),
}
str_to_raw_arg : Str -> [Utf8(Str), UnixBytes(List(U8)), WindowsU16s(List(U16))]
str_to_raw_arg = |arg| UnixBytes(Str.to_utf8(arg))