module Rack::Cargo::ReferenceResolver

Constants

PLACEHOLDER_END
PLACEHOLDER_PATTERN
PLACEHOLDER_START
REFERENCING_ENABLED

Public Class Methods

call(request, state) click to toggle source
# File lib/rack/cargo/reference_resolver.rb, line 13
def call(request, state)
  REFERENCING_ENABLED.each do |attribute_key|
    next if request.fetch(attribute_key).nil?

    element, converted_to_json = get_json_element(request, attribute_key)
    placeholders = find_placeholders(element)

    element = replace_placeholders(element, placeholders, state)
    element = JSON.parse(element) if converted_to_json

    request.store(attribute_key, element)
  end
end

Private Class Methods

find_placeholders(element) click to toggle source
# File lib/rack/cargo/reference_resolver.rb, line 52
def find_placeholders(element)
  element.scan(PLACEHOLDER_PATTERN).flatten
end
get_json_element(request, attribute_key) click to toggle source
# File lib/rack/cargo/reference_resolver.rb, line 56
def get_json_element(request, attribute_key)
  element_copy = request.fetch(attribute_key).dup

  if element_copy.is_a?(String)
    [element_copy, false]
  else
    [element_copy.to_json, true]
  end
end
replace_placeholders(element, placeholders, state) click to toggle source
# File lib/rack/cargo/reference_resolver.rb, line 29
def replace_placeholders(element, placeholders, state)
  previous_responses = state.fetch(:previous_responses)

  placeholders.each do |placeholder|
    value_path = value_path_for(placeholder)
    value = previous_responses.dig(*value_path)
    next unless value

    replacement_regex = replacement_regex_for(placeholder)
    element = element.gsub(replacement_regex, value.to_s)
  end

  element
end
replacement_regex_for(placeholder) click to toggle source
# File lib/rack/cargo/reference_resolver.rb, line 48
def replacement_regex_for(placeholder)
  /#{PLACEHOLDER_START}#{placeholder}#{PLACEHOLDER_END}/
end
value_path_for(placeholder) click to toggle source
# File lib/rack/cargo/reference_resolver.rb, line 44
def value_path_for(placeholder)
  placeholder.split(".").map(&:to_s).insert(1, REQUEST_BODY)
end