Nilable options¶
You may have noticed that Clip adds in the help message if the option has a default value or is required. It looks like this:
  --repeat INTEGER  [default: 1]
or
  --repeat INTEGER  [required]
Sometimes you may not want those messages to be shown. Maybe you want the option to be optional and have a default value, but you don't want to expose this value to the user.
We can do this by making the attribute's type nilable and set its default value nil:
require "clip"
module Myapplication
  VERSION = "0.1.0"
  struct Command
    include Clip::Mapper
    getter repeat : Int32? = nil
    getter name : 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, command.repeat)
    end
  end
  def self.hello(name, repeat)
    if repeat.nil?
      puts "Hello #{name}"
    else
      repeat.times { puts "Hello #{name}" }
    end
  end
end
Myapplication.run
Tip
As our attribute does have a default value we don't have to explicitly add the Clip::Option annotation.
Note
command.repeat is now either an Int32 or a Nil value, so we can't directly call #times on it or the compiler will complain that this method is not defined for Nil.
The help now looks like this:
$ shards build
Dependencies are satisfied
Building: myapplication
$ ./bin/myapplication --help
Usage: ./bin/myapplication [OPTIONS] NAME
Arguments:
  NAME  [required]
Options:
  --repeat INTEGER
  --help            Show this message and exit.
And the behavior is still the same:
$ ./bin/myapplication Alice
Hello Alice
$ ./bin/myapplication --repeat 2 Alice
Hello Alice
Hello Alice
Whether you choose to use a default nil value or not is up to you.