Class: Hollerith::ArgumentDecoder

Inherits:
Object
  • Object
show all
Defined in:
lib/hollerith/utilities/argument_decoder.rb

Class Method Summary collapse

Class Method Details

.decode_argument(declaration) ⇒ Object

“result,%%_make_external_request($$_oi,true)” becomes

‘result’, ‘%%_make_external_request($$_oi,true)’

harder than it looks :)



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
54
55
56
57
58
59
# File 'lib/hollerith/utilities/argument_decoder.rb', line 7

def self.decode_argument declaration
  arguments = declaration.match(/\((?>[^)(]+|\g<0>)*\)/)[0][1..-2]

  arguments_array = []
  each_argument = ''
  unclosed_parens = 0
  unclosed_square_brackets = 0
  unclosed_single_quotes = 0
  unclosed_double_quotes = 0

  arguments.split('').each do |char|
    everything_is_closed = (
      unclosed_parens == 0 &&
      unclosed_square_brackets == 0 &&
      unclosed_single_quotes == 0 &&
      unclosed_double_quotes == 0
    )

    if everything_is_closed && char == ','
      arguments_array << each_argument
      each_argument = ''
    elsif char == '('
      unclosed_parens += 1
      each_argument += char
    elsif char == ')'
      unclosed_parens -= 1
      each_argument+= char
    elsif char == "["
      unclosed_square_brackets += 1
      each_argument += char
    elsif char == ']'
      unclosed_square_brackets -= 1
      each_argument+= char
    elsif char == "'" && unclosed_single_quotes == 0
      unclosed_single_quotes += 1
      each_argument += char
    elsif char == "'"
      unclosed_single_quotes -= 1
      each_argument+= char
    elsif char == '"' && unclosed_double_quotes == 0
      unclosed_double_quotes += 1
      each_argument += char
    elsif char == '"'
      unclosed_double_quotes -= 1
      each_argument+= char
    else
      each_argument += char
    end
  end
  arguments_array << each_argument

  arguments_array
end