Sha256: 033b8bc4359e5dab88e6ad023fb729bcd0bb232c3c64bdd32a61363891c63765

Contents?: true

Size: 1.57 KB

Versions: 4

Compression:

Stored size: 1.57 KB

Contents

module VkontakteApi
  # A module that handles method result processing.
  #
  # It implements method blocks support, result typecasting and raises `VkontakteApi::Error` in case of an error response.
  module Result
    class << self
      # The main method result processing.
      # @param [Hashie::Mash] response The server response in mash format.
      # @param [Symbol] type The expected result type (`:boolean` or `:anything`).
      # @param [Proc] block A block passed to the API method.
      # @return [Array, Hashie::Mash] The processed result.
      # @raise [VkontakteApi::Error] raised when VKontakte returns an error response.
      def process(response, type, block)
        result = extract_result(response)
        
        if result.respond_to?(:each)
          # enumerable result receives :map with a block when called with a block
          # or is returned untouched otherwise
          block.nil? ? result : result.map(&block)
        else
          # non-enumerable result is typecasted
          # (and yielded if block_given?)
          result = typecast(result, type)
          block.nil? ? result : block.call(result)
        end
      end
      
    private
      def extract_result(response)
        if response.error?
          raise VkontakteApi::Error.new(response.error)
        else
          response.response
        end
      end
      
      def typecast(parameter, type)
        case type
        when :boolean
          # '1' becomes true, '0' becomes false
          !parameter.to_i.zero?
        else
          parameter
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
vkontakte_api-1.4.4 lib/vkontakte_api/result.rb
vkontakte_api-1.4.3 lib/vkontakte_api/result.rb
vkontakte_api-1.4.2 lib/vkontakte_api/result.rb
vkontakte_api-1.4 lib/vkontakte_api/result.rb