Skip to content

Latest commit

 

History

History
77 lines (61 loc) · 2.18 KB

option_builders.md

File metadata and controls

77 lines (61 loc) · 2.18 KB

Option builders

Option builders offer a mechanism for dynamic option creation. This is useful in situations when there's a common pattern or options can be created automatically based on some data.

The builder's interface is very simple. It has to define the only method build(builder_params={}) that returns array of HammerCLI::Options::OptionDefinition instances.

Example of a simple option builder follows:

class DimensionsOptionBuilder < AbstractOptionBuilder

  def initialize(option_names)
    @option_names = option_names
  end

  def build(builder_params={})
    opts = []
    @option_names.each do |name|
      opts << option("--#{name}-height", "#{name.upcase}_HEIGHT", "Height of the #{name}")
      opts << option("--#{name}-width", "#{name.upcase}_WIDTH", "Width of the #{name}")
    end
    opts
  end

end

Each command class has an option builder defined in method option_builder. It is executed by calling class method build_options.

class HouseCommand < HammerCLI::AbstractCommand

  # define your own option builder
  def self.option_builder
    DimensionsOptionBuilder.new(["door", "window"])
  end

  # create the options at class level
  build_options
end
hammer house -h
Usage:
    hammer house [OPTIONS]

    --door-height DOOR_HEIGHT     Height of the door
    --door-width DOOR_WIDTH       Width of the door
    --window-height WINDOW_HEIGHT Height of the window
    --window-width WINDOW_WIDTH   Width of the window
    -h, --help                    print help

The default option builder is OptionBuilderContainer that is useful for chaining multiple builders. Command's class method custom_option_builders is there exactly for this reason. It's output is passed to the container and can be used for defining custom builders.

def self.custom_option_builders
  [
    DimensionsOptionBuilder.new(["door", "window"]),
    IdentifierOptionBuilder.new,
    SomeOtherCoolBuilder.new
  ]
end

If an option with the same --flag is already defined (either statically or from another builder) any other option with the same flag is ignored.