Module: OptionBinder::Switch

Defined in:
lib/optbind.rb

Class Method Summary collapse

Class Method Details

.parser_opts_from_hash(hash = {}, &handler) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/optbind.rb', line 130

def self.parser_opts_from_hash(hash = {}, &handler)
  style = case (hash[:style] || hash[:mode]).to_s.downcase
  when 'required' then :REQUIRED
  when 'optional' then :OPTIONAL
  end

  pattern = hash[:pattern] || hash[:type]
  values = hash[:values]
  names = [hash[:long], hash[:longs]].flatten.map { |n| n.to_s.sub(/\A-{,2}/, '--') if n }
  names += [hash[:short], hash[:shorts]].flatten.map { |n| n.to_s.sub(/\A-{,2}/, '-') if n }
  names += [hash[:name], hash[:names]].flatten.map do |n|
    next unless n
    n = n.to_s
    next n if n[0] == '-'
    n[2] ? "--#{n}" : "-#{n}"
  end

  argument = (hash[:argument].to_s.sub(/\A(\[)?=?/, '=\1') if hash[:argument])
  description = ([hash[:description]].flatten * ' ' if hash[:description])
  handler ||= hash[:handler]
  return ([style, pattern, values] + names + [argument, description]).compact, handler
end

.parser_opts_from_string(string = '', &handler) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/optbind.rb', line 153

def self.parser_opts_from_string(string = '', &handler)
  shorts, longs = [], []

  while string.sub!(/\A(?:(?<short>-\w)\s+)/, '')
    shorts << $~[:short]
  end

  style, pattern, values, argument = nil

  while string.sub!(/\A(?:(?<long>--[\[\]\-\w]+[\]\w]+)?(?:(?<argument>(?:\[?=?|=\[)[<(]\S+[)>]\.{,3}\]?)|\s+))/, '')
    longs << $~[:long] if $~[:long]
    next unless $~[:argument]
    argument = $~[:argument]
    style = argument =~ /\A=?[<(]/ ? :REQUIRED : :OPTIONAL
    values = $~[:values].split('|') if argument =~ /(?:\[?=?|=\[)\((?<values>\S*)\)\]?/

    if values.nil? && argument =~ /(?:\[?=?|=\[)<(?<name>\S+):(?<pattern>\S+)>\]?/
      pattern = Module.const_get($~[:pattern]) rescue Regexp.new($~[:pattern])
      argument = "=<#{$~[:name]}>"
      argument = "=[#{argument[1..-1]}]" if style == :OPTIONAL
    else
      argument.sub!(/\A(?:=\[|\[?=?)/, style == :OPTIONAL ? '=[' : '=')
    end
  end

  description = !string.empty? ? string.strip : nil
  return ([style, pattern, values] + shorts + longs + [argument, description]).compact, handler
end