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.