Sha256: 45b70a9711ef1ea8e5a02b5aaf15a218fddf3cfdc2cc78cfb6504a1b2953cdf2

Contents?: true

Size: 1.82 KB

Versions: 4

Compression:

Stored size: 1.82 KB

Contents

module NxtHttpClient
  module ClientDsl
    def configure(opts = {}, &block)
      opts.each { |k, v| config.send(k, v) }
      config.tap { |d| block.call(d) }
      config
    end

    def log(&block)
      @logger ||= block || dup_option_from_ancestor(:@logger)

      return unless @logger.present?
      logger = @logger

      around_fire do |client, request, response_handler, fire|
        Logger.new(logger).call(client, request, response_handler, fire)
      end
    end

    def clear_fire_callbacks(*kinds)
      callbacks.clear(*kinds)
    end

    def before_fire(&block)
      callbacks.register(:before, block)
    end

    def after_fire(&block)
      callbacks.register(:after, block)
    end

    def around_fire(&block)
      callbacks.register(:around, block)
    end

    def config
      @config ||= dup_option_from_ancestor(:@config) { Config.new }
    end

    def callbacks
      @callbacks ||= dup_option_from_ancestor(:@callbacks) { FireCallbacks.new }
    end

    def response_handler(handler = Undefined.new, &block)
      if undefined?(handler)
        @response_handler ||= dup_option_from_ancestor(:@response_handler) { NxtHttpClient::ResponseHandler.new }
      else
        @response_handler = handler
      end

      @response_handler.configure(&block) if block_given?
      @response_handler
    end

    private

    def client_ancestors
      ancestors.select { |ancestor| ancestor <= NxtHttpClient::Client }
    end

    def option_from_ancestors(name)
      client = client_ancestors.find { |c| c.instance_variable_get(name) }
      client && client.instance_variable_get(name)
    end

    def dup_option_from_ancestor(name)
      result = option_from_ancestors(name).dup
      return result unless block_given?

      result || yield
    end

    def undefined?(value)
      value.is_a?(Undefined)
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
nxt_http_client-2.1.1 lib/nxt_http_client/client_dsl.rb
nxt_http_client-2.1.0 lib/nxt_http_client/client_dsl.rb
nxt_http_client-2.0.1 lib/nxt_http_client/client_dsl.rb
nxt_http_client-2.0.0 lib/nxt_http_client/client_dsl.rb