Sha256: fae5bffa3139f7998528bc03fc97c0a7b73fa71c56cee10ea51595a2bcc8a1bb
Contents?: true
Size: 1.38 KB
Versions: 30
Compression:
Stored size: 1.38 KB
Contents
# frozen_string_literal: true module Motor module Queries module RenderSqlTemplate SECTION_OPEN_REGEXP = /{{([#^])\s*(\w+)}}.*\z/m.freeze VARIABLE_REGEXP = /{{\s*(\w+)\s*}}/m.freeze module_function def call(sql, variables) result = render_sections(sql, variables) interpolate_variables(result, variables) end def interpolate_variables(sql, variables) selected_variables = [] rendered = sql.gsub(VARIABLE_REGEXP) do variable_name = Regexp.last_match[1] index = selected_variables.index { |name, _| name == variable_name } selected_variables << [variable_name, variables[variable_name]] unless index "$#{selected_variables.size}" end [rendered, selected_variables] end def render_sections(sql, variables) sql.sub(SECTION_OPEN_REGEXP) do |e| variable_name = Regexp.last_match[2] is_negative = Regexp.last_match[1] == '^' _, content, rest = e.split(build_section_close_regexp(variable_name), 3) is_present = variables[variable_name].present? render_sections(is_present ^ is_negative ? content + rest.to_s : rest, variables) end end def build_section_close_regexp(variable_name) %r{{{[#^/]s*#{Regexp.escape(variable_name)}\s*}}}m end end end end
Version data entries
30 entries across 30 versions & 1 rubygems