aaronrenner/full_circle

View on GitHub
lib/full_circle/response_parser.rb

Summary

Maintainability
A
45 mins
Test Coverage
require 'multi_xml'

module FullCircle
  class ResponseParser

    def initialize(data_extractor: Parsing::ResponseXMLDataExtractor.new)
      @data_extractor = data_extractor
    end

    def parse(xml_string, entity_builder: nil)
      if xml_string.empty?
        Response.new([], FullCircle::ResponseMetadata.new)
      else

        extractor_response = data_extractor.extract(xml_string)

        if extractor_response.entities.any?
          if entity_builder.nil?
            entity_builder = entity_builder_for_key(extractor_response.entity_key)
          end

          entities = extractor_response.entities.map do |entity_hash|
            entity_builder.build(entity_hash)
          end

          Response.new(entities, extractor_response.metadata)
        else
          Response.new([], extractor_response.metadata)
        end
      end
    end

    private

    attr_reader :data_extractor

    def entity_builder_for_key(entity_key)
      case entity_key
      when "ad"
        Builders::AdBuilder
      when "coupon"
        Builders::CouponBuilder
      when "event"
        Builders::EventBuilder
      when "eventArea"
        Builders::EventAreaBuilder
      when "job"
        Builders::JobBuilder
      else
        raise "Unknown builder for key #{entity_key}"
      end
    end
  end
end