Multiple values¶
You may want your options or arguments to accept multiple values.
Think for example of ls or curl:
$ curl --header "X-First-Name: Jean" --header "X-Last-Name: Martin" http://frenchexample.org/
$ ls file1 file2 file3
Here we gave 2 --headers options to curl, and 3 FILE argument to ls.
Clip also supports that. We just declare our option or argument's type as an array.
Options with multiple value¶
require "clip"
module Myapplication
VERSION = "0.1.0"
struct Command
include Clip::Mapper
getter name = ["World"]
end
def self.run
begin
command = Command.parse
rescue ex : Clip::Error
puts ex
return
end
if command.is_a?(Clip::Mapper::Help)
puts command.help
else
hello(command.name)
end
end
def self.hello(name)
puts "Hello #{name.join(", ")}"
end
end
Myapplication.run
$ shards build
Dependencies are satisfied
Building: myapplication
$ ./bin/myapplication --help
Usage: ./bin/myapplication [OPTIONS]
Options:
--name TEXT [default: [World]]
--help Show this message and exit.
$ ./bin/myapplication
Hello World
$ ./bin/myapplication --name Alice --name Barbara --name Chloé
Hello Alice, Barbara, Chloé
Arguments with multiple values¶
require "clip"
module Myapplication
VERSION = "0.1.0"
struct Command
include Clip::Mapper
getter name : Array(String)
end
def self.run
begin
command = Command.parse
rescue ex : Clip::Error
puts ex
return
end
if command.is_a?(Clip::Mapper::Help)
puts command.help
else
hello(command.name)
end
end
def self.hello(name)
puts "Hello #{name.join(", ")}"
end
end
Myapplication.run
$ shards build
Dependencies are satisfied
Building: myapplication
$ ./bin/myapplication --help
Usage: ./bin/myapplication [OPTIONS] NAME...
Arguments:
NAME [required]
Options:
--help Show this message and exit.
$ ./bin/myapplication Alice Barbara Chloé
Hello Alice, Barbara, Chloé
Supported types¶
All the types supported for one value are supported for multiple values.
The only exception is the type Bool, because it makes no sens to have a flag option repeated multiple times.
The supported types are:
- array of all subtypes of
Int - array of all subtypes of
Float Array(String)- and all those types combined with
Nil
Default value¶
Like with options and arguments with only one value, a multiple values options or arguments can have a default value. If so, it will not be required.
If you want it to not have the message [default: [value]] in the help, just set the default value to nil.
Warning
If the default value is Array(String).new or [] of String, it will be shown as is in the help message.
A better way is to make the type nilable and to set its default value to nil.