class VtApi::ApiProvider

API interaction class.

Uses [Faraday] for HTTP interaction.

Public Class Methods

new(api_version = Versions::DEFAULT, adapter = :net_http) click to toggle source

Create new ApiProvider.

@param [ApiVersion] api_version API interface to use. @param [Object] adapter Faraday HTTP adapter. @return [Object]

# File lib/vt_api/internal/api_provider.rb, line 21
def initialize(api_version = Versions::DEFAULT, adapter = :net_http)
        unless api_version.is_a? ApiVersion
                raise ArgumentError,
                      "Invalid API interface supplied! Must be subclass of 'ApiVersion', got #{api_version.class} instead"
        end

        @api        = api_version
        @connection = Faraday.new @api.base_url do |conn|
                conn.request :multipart
                conn.request :url_encoded

                conn.adapter adapter
        end
end

Public Instance Methods

request(method_name, params = {}) click to toggle source

Performs a request to given API method. Requested method must be described in API interface.

@raise [UndefinedMethodError] @raise [MissingParametersError] @raise [ApiError]

@param [String] method_name @param [Hash] params @return [OpenStruct] Method result object.

# File lib/vt_api/internal/api_provider.rb, line 46
def request(method_name, params = {})
        endpoint = endpoint(method_name, params)

        result = @connection.public_send(endpoint.method, endpoint.uri, params, {})

        raise ApiError, "#{@api.version} error: #{@api.error(result.status)}" if @api.error? result.status

        # noinspection RubyResolve
        JSON.parse result.body, object_class: OpenStruct
end

Private Instance Methods

endpoint(method_name, params) click to toggle source
# File lib/vt_api/internal/api_provider.rb, line 59
def endpoint(method_name, params)
        unless @api.endpoint? method_name
                raise UndefinedMethodError,
                      "Endpoint '#{method_name}' not found in '#{@api.version}' API interface."
        end

        endpoint = @api.endpoint method_name

        unless endpoint.params_valid? params
                raise MissingParametersError,
                      "Missed parameters #{endpoint.missing_params(params)} required by endpoint '#{method_name}'."
        end
        endpoint
end