Sha256: a8e971ecdb1c298257d2bdb08808ec059c642b8b62732d48a11b6adb16d02dbe

Contents?: true

Size: 1.91 KB

Versions: 2

Compression:

Stored size: 1.91 KB

Contents

require 'faraday_middleware'

class Kapellmeister::Dispatcher
  def self.inherited(base)
    super
    base.extend(Kapellmeister::RequestsExtension)

    delegate :report, :configuration, :logger, to: base.module_parent
  end

  FailedResponse = Struct.new(:success?, :response, :payload)

  def connection_by(method_name, path, data = {}, query = {})
    additional_headers = data.delete(:headers) || {}
    requests_data = data.delete(:request) || {}

    generated_connection = connection(additional_headers:, requests_data:)

    process generated_connection.run_request(method_name.downcase.to_sym, path, data.to_json, additional_headers)
  rescue NoMethodError, NameError, RuntimeError
    raise "Library can't process method #{method_name} yet"
  rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
    failed_response(details: e.message)
  end

  def headers
    {}
  end

  def request_options
    {}
  end

  private

  def connection(additional_headers:, requests_data:)
    ::Faraday.new(url: configuration.url,
                  headers: headers_generate(**additional_headers),
                  request: requests_generate(**requests_data)) do |faraday|
      faraday.request :json, content_type: 'application/json; charset=utf-8'
      faraday.request :multipart
      faraday.response :logger, logger
      faraday.response :json, content_type: 'application/json; charset=utf-8'
      faraday.adapter :typhoeus do |http|
        http.timeout = 20
      end
    end
  end

  def headers_generate(**additional)
    {
      # accept: 'application/json, text/plain, */*, charset=utf-8',
      **additional,
      **headers
    }
  end

  def requests_generate(**requests_data)
    {
      **requests_data,
      **request_options
    }
  end

  def process(data)
    report(data).result
  end

  def failed_response(**args)
    FailedResponse.new(false, { message: "#{self.class} no connection" }, { status: 555, **args })
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
kapellmeister-0.5.2 lib/kapellmeister/dispatcher.rb
kapellmeister-0.5.1 lib/kapellmeister/dispatcher.rb