Sha256: 8374bf43e9d66507e4b919b4e47fe7a23fabc0cc2a5f90a336557e6e3753be82

Contents?: true

Size: 1.32 KB

Versions: 1

Compression:

Stored size: 1.32 KB

Contents

module JSONAPIonify::Api
  class Response
    attr_reader :action, :accept, :response_block, :status

    def initialize(action, accept: nil, status: nil, &block)
      @action         = action
      @response_block = block || proc {}
      @accept         = accept || 'application/vnd.api+json'
      @status         = status || 200
    end

    def ==(other)
      self.class == other.class &&
        %i{@accept}.all? do |ivar|
          instance_variable_get(ivar) == other.instance_variable_get(ivar)
        end
    end

    def accept?(request)
      request.accept.any? do |accept|
        @accept == accept || accept == '*/*' || self.accept == '*/*'
      end
    end

    def documentation_object
      OpenStruct.new(
        accept:       accept,
        content_type: accept,
        status:       status
      )
    end

    def call(instance, context)
      response = self
      instance.instance_eval do
        body = instance_exec(context, &response.response_block)
        Rack::Response.new.tap do |rack_response|
          rack_response.status = response.status
          response_headers.each { |k, v| rack_response.headers[k] = v }
          rack_response.headers['content-type'] = response.accept unless response.accept == '*/*'
          rack_response.write(body) unless body.nil?
        end.finish
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jsonapionify-0.0.1.pre lib/jsonapionify/api/response.rb