Sha256: 41f56f89b0fbacfe8af04e96e8245c208ffd2d36f0d6b085ee050dc1cd1a52dd

Contents?: true

Size: 1.65 KB

Versions: 2

Compression:

Stored size: 1.65 KB

Contents

module Faraday
  # Possibly going to extend this a bit.
  #
  # Faraday::Connection.new(:url => 'http://sushi.com') do |b|
  #   b.request  :yajl     # Faraday::Request::Yajl
  #   b.adapter  :logger   # Faraday::Adapter::Logger
  #   b.response :yajl     # Faraday::Response::Yajl
  # end
  class Builder
    attr_accessor :handlers

    def self.create(&block)
      Builder.new(&block)
    end

    def self.inner_app
      lambda do |env| 
        env[:parallel_manager] ? env[:response] : env[:response].finish(env)
      end
    end

    def initialize(handlers = [], &block)
      @handlers = handlers
      build(&block) if block_given?
    end

    def build(&block)
      block.call(self)
      run(self.class.inner_app)
    end

    def [](index)
      # @handlers are stored in reverse order
      @handlers[-(index+1)]
    end

    def run(app)
      @handlers.unshift app
    end

    def to_app
      inner_app = @handlers.first
      @handlers[1..-1].inject(inner_app) { |app, middleware| middleware.call(app) }
    end

    def use(klass, *args, &block)
      run(lambda { |app| klass.new(app, *args, &block) })
    end

    def request(key, *args, &block)
      use_symbol Faraday::Request, key, *args, &block
    end

    def response(key, *args, &block)
      use_symbol Faraday::Response, key, *args, &block
    end

    def adapter(key, *args, &block)
      use_symbol Faraday::Adapter, key, *args, &block
    end

    def use_symbol(mod, key, *args, &block)
      use mod.lookup_module(key), *args, &block
    end

    def ==(other)
      other.is_a?(self.class) && @handlers == other.handlers
    end

    def dup
      self.class.new @handlers.dup
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
faraday-0.3.1 lib/faraday/builder.rb
faraday-0.3.0 lib/faraday/builder.rb