1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
require "clamp/attribute/definition"
module Clamp
module Parameter
class Definition < Attribute::Definition
def initialize(name, description, options = {})
@name = name
@description = description
super(options)
@multivalued = (@name =~ ELLIPSIS_SUFFIX)
@required = options.fetch(:required) do
(@name !~ OPTIONAL)
end
@inheritable = options.fetch(:inheritable, true)
end
attr_reader :name
def inheritable?
@inheritable
end
def help_lhs
name
end
def consume(arguments)
raise ArgumentError, Clamp.message(:no_value_provided) if required? && arguments.empty?
arguments.shift(multivalued? ? arguments.length : 1)
end
private
ELLIPSIS_SUFFIX = / \.\.\.$/
OPTIONAL = /^\[(.*)\]/
VALID_ATTRIBUTE_NAME = /^[a-z0-9_]+$/
def infer_attribute_name
inferred_name = name.downcase.tr("-", "_").sub(ELLIPSIS_SUFFIX, "").sub(OPTIONAL) { Regexp.last_match(1) }
unless inferred_name =~ VALID_ATTRIBUTE_NAME
raise "cannot infer attribute_name from #{name.inspect}"
end
inferred_name += "_list" if multivalued?
inferred_name
end
end
end
end
|