Sha256: d131d65105bed19c6f5549532cc2d8dddef510cc139cbbbbfd50f8f1ea3db88c

Contents?: true

Size: 1.21 KB

Versions: 2

Compression:

Stored size: 1.21 KB

Contents

module Munson
  class ResponseMapper
    class UnsupportedDatatype < StandardError;end;

    def initialize(response)
      @data     = response.body[:data]
      @includes = response.body[:include]
    end

    def resources
      if data_is_collection?
        map_data(@data)
      else
        raise StandardError, "Called #resources, but response was a single resource. Use ResponseMapper#resource"
      end
    end

    def resource
      if data_is_resource?
        map_data(@data)
      else
        raise StandardError, "Called #resource, but response was a collection of resources. Use ResponseMapper#resources"
      end
    end

    private

    def data_is_resource?
      @data.is_a?(Hash)
    end

    def data_is_collection?
      @data.is_a?(Array)
    end

    def map_data(data)
      if data_is_collection?
        @data.map{ |datum| map_resource(datum) }
      elsif data_is_resource?
        map_resource(@data)
      else
        raise UnsupportedDatatype, "No mapping rule for #{data.class}"
      end
    end

    def map_resource(resource)
      if klass = Munson.lookup_type(resource[:type])
        klass.new(resource[:attributes].merge(id: resource[:id]))
      else
        resource
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
munson-0.2.0 lib/munson/response_mapper.rb
munson-0.1.0 lib/munson/response_mapper.rb