Converter.to_h_exclude_key()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
module Rapis
2
  class Converter
3
    include Rapis::TemplateFunctions
4
5
    CHANGE_SETS = {
6
      'x-amazon-apigateway-integration' => 'amazon_apigateway_integration',
7
      '$ref' => 'ref'
8
    }
9
10
    def to_dsl(hash)
11
      dsl = Dslh.deval(
12
        hash,
13
        exclude_key: to_dsl_exclude_key,
14
        key_conv: to_dsl_key_conv,
15
        value_conv: to_dsl_value_conv
16
      )
17
      dsl.gsub!(/^/, '  ').strip!
18
      <<-EOS
19
rest_api do
20
  #{dsl}
21
end
22
EOS
23
    end
24
25
    def to_h(dsl)
26
      instance_eval(dsl)
27
      @apis
28
    end
29
30
    private
31
32
    def to_dsl_exclude_key
33
      proc do |k|
34
        if !k.is_a?(String)
35
          false
36
        elsif ['in'].include?(k)
37
          true
38
        elsif k.include?('/')
39
          if k =~ %r{^\/}
40
            false
41
          else
42
            true
43
          end
44
        elsif ['-', '.'].any? { |i| k.include?(i) } && k != 'x-amazon-apigateway-integration'
45
          true
46
        else
47
          false
48
        end
49
      end
50
    end
51
52
    def to_dsl_key_conv
53
      proc do |k|
54
        k = k.to_s
55
        case k
56
        when %r{^\/}
57
          item_key_proc k
58
        when /^\d{3}$/
59
          code_key_proc k
60
        when 'parameters', 'api_key'
61
          parameters_key_proc k
62
        else
63
          CHANGE_SETS.each { |f, t| k = k.gsub(f, t) }
64
          k
65
        end
66
      end
67
    end
68
69
    def item_key_proc(k)
70
      proc do |v, nested|
71
        if nested
72
          "item #{k.inspect} #{v}"
73
        else
74
          "item #{k.inspect}, #{v}"
75
        end
76
      end
77
    end
78
79
    def code_key_proc(k)
80
      proc do |v, nested|
81
        if nested
82
          "code #{k.to_s.inspect} #{v}"
83
        else
84
          "code #{k.to_s.inspect}, #{v}"
85
        end
86
      end
87
    end
88
89
    def parameters_key_proc(k)
90
      proc do |v, _|
91
        if v =~ /\n(\s+)/
92
          indent = Regexp.last_match(1)
93
          v = instance_eval(v)
94
          dsl = "#{k} do\n"
95
          if v.is_a?(Array)
96
            v.each do |param|
97
              dsl << param_to_dsl(param, indent)
98
            end
99
          else
100
            dsl << param_to_dsl(v, indent)
101
          end
102
          dsl << indent[2..-1] + "end\n"
103
        else
104
          "#{k} #{v}"
105
        end
106
      end
107
    end
108
109
    def param_to_dsl(param, indent)
110
      dsl = indent + "#{param['in']} #{param['name'].inspect} do\n"
111
      param.each do |pk, pv|
112
        next if %w(in name).include?(pk)
113
        dsl << indent
114
        dsl += pv.is_a?(String) ? "  #{pk} #{pv.inspect}\n" : "  #{pk} #{pv}\n"
115
      end
116
      dsl << indent + "end\n"
117
    end
118
119
    def to_dsl_value_conv
120
      proc do |v|
121
        if v.is_a?(String) && v =~ /\A(?:0|[1-9]\d*)\Z/
122
          v.to_i
123
        else
124
          v
125
        end
126
      end
127
    end
128
129
    def to_h_exclude_key
130
      proc do |_|
131
        false
132
      end
133
    end
134
135
    def to_h_key_conv
136
      proc do |k|
137
        k = k.to_s
138
        CHANGE_SETS.each { |f, t| k = k.gsub(t, f) }
139
        k
140
      end
141
    end
142
143
    def to_h_value_conv
144
      proc do |v|
145
        case v
146
        when Hash, Array, TrueClass, FalseClass
147
          v
148
        else
149
          v.to_s
150
        end
151
      end
152
    end
153
154
    def rest_api(&block)
155
      @apis = Dslh.eval(
156
        exclude_key: to_h_exclude_key,
157
        key_conv: to_h_key_conv,
158
        value_conv: to_h_value_conv,
159
        allow_empty_args: true,
160
        scope_hook: proc { |scope| define_template_func(scope) },
161
        &block
162
      )
163
    end
164
165
    def define_template_func(scope)
166
      scope.instance_eval(<<-EOS)
167
        #{template_code_func}
168
        #{template_item_func}
169
        #{template_api_key_func}
170
        #{template_params_func}
171
        #{template_include_func}
172
        EOS
173
    end
174
  end
175
end
176