Sha256: b615a7b72fab1e55c731752cffd211f029cbad76d4b4ebacc500d21596f58a64

Contents?: true

Size: 1.34 KB

Versions: 2

Compression:

Stored size: 1.34 KB

Contents

module Restfulie::Client
  class Dsl

    def initialize
      @requests = []
      trait :base
      trait :verb
      request :base_request
      request :setup_header
      request :serialize_body
      request :enhance_response
      # request :cache
      request :follow_request
    end
    
    def request(what)
      req = "Restfulie::Client::Feature::#{what.to_s.classify}".constantize
      @requests << req
      self
    end

    def trait(sym)
      t = "Restfulie::Client::Feature::#{sym.to_s.classify}".constantize
      self.extend t
      self
    end

    def method_missing(sym, *args)
      if Restfulie::Client::Feature.const_defined? sym.to_s.classify
        loaded = true
        trait sym
      end
      if Restfulie::Client::Feature.const_defined? "#{sym.to_s.classify}Request"
        loaded = true
        request "#{sym.to_s}Request"
      end
      if loaded
        self
      else
        super sym, *args
      end
    end
    
    def request_flow(env = {})
      Parser.new(@requests).continue(self, nil, env)
    end

  end
  
  class Parser
    
    def initialize(stack)
      @stack = stack.dup
    end
    
    def continue(request, response, env)
      current = @stack.pop
      if current.nil?
        return response
      end
      filter = current.new
      filter.execute(self, request, response, env)
    end
    
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
restfulie-1.0.0.beta1 lib/restfulie/client/dsl.rb
restfulie-0.1.0.beta1 lib/restfulie/client/dsl.rb