Sha256: 26f377fb898573c62b4f34a3dea0b3371132b54fc3e7c8de0749e890088c6bdc

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

module Clamp

  class Parameter

    def initialize(name, description, options = {})
      @name = name
      @description = description
      infer_attribute_name_and_multiplicity
      if options.has_key?(:attribute_name)
        @attribute_name = options[:attribute_name].to_s 
      end
      if options.has_key?(:default)
        @default_value = options[:default]
      end
    end

    attr_reader :name, :description, :attribute_name, :default_value
    
    def help
      rhs = description
      if defined?(@default_value)
        rhs += " (default: #{@default_value.inspect})"
      end
      [name, rhs]
    end

    def consume(arguments)
      if required? && arguments.empty?
        raise ArgumentError, "no value provided"
      end
      if multivalued?
        arguments.shift(arguments.length)
      else
        arguments.shift
      end
    end
    
    private

    NAME_PATTERN = "([A-Za-z0-9_-]+)"
    
    def infer_attribute_name_and_multiplicity
      case @name
      when /^\[#{NAME_PATTERN}\]$/
        @attribute_name = $1
      when /^\[#{NAME_PATTERN}\] ...$/
        @attribute_name = "#{$1}_list"
        @multivalued = true
      when /^#{NAME_PATTERN} ...$/
        @attribute_name = "#{$1}_list"
        @multivalued = true
        @required = true
      when /^#{NAME_PATTERN}$/
        @attribute_name = @name
        @required = true
      else
        raise "invalid parameter name: '#{name}'"
      end
      @attribute_name = @attribute_name.downcase.tr('-', '_')
    end
    
    def multivalued?
      @multivalued
    end

    def required?
      @required
    end
    
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
clamp-0.1.6 lib/clamp/parameter.rb