Module: OptionBinder::Switch

Defined in:
lib/optbind.rb

Class Method Summary collapse

Class Method Details

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



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/optbind.rb', line 142

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\[=/, '=[') 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



165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/optbind.rb', line 165

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[0] == '=' ? :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\[=/, '=[')
    end
  end

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