Sha256: 12e096bc7d06684a8ef5642dbbd2ee45eaf46f18694d7ee2e4b099009e882bfa

Contents?: true

Size: 1.9 KB

Versions: 2

Compression:

Stored size: 1.9 KB

Contents

require 'rack'

class Usher
  module Interface
    class RackInterface
      
      attr_reader :router
      
      class Builder < Rack::Builder
        
        def initialize(&block)
          @usher = Usher::Interface::RackInterface.new
          super
        end
        
        def map(path, options = nil, &block)
          @usher.add(path, options).to(&block)
          @ins << @usher unless @ins.last == @usher
        end
        
      end
      
      def initialize(&blk)
        @router = Usher.new(:request_methods => [:request_method, :host, :port, :scheme], :generator => Usher::Util::Generators::URL.new)
        instance_eval(&blk) if blk
      end
      
      def add(path, options = nil)
        @router.add_route(path, options)
      end
      
      def parent_route=(route)
        @router.parent_route = route
      end
      
      def parent_route
        @router.parent_route
      end

      def reset!
        @router.reset!
      end

      def call(env)
        env['usher.params'] ||= {}
        response = @router.recognize(request = Rack::Request.new(env), request.path_info)
        if response.nil?
          body = "No route found"
          headers = {"Content-Type" => "text/plain", "Content-Length" => body.length.to_s}
          [404, headers, [body]]
        else
          params = response.path.route.default_values || {}
          response.params.each{ |hk| params[hk.first] = hk.last}
          
          # consume the path_info to the script_name response.remaining_path
          env["SCRIPT_NAME"] << response.matched_path   || ""
          env["PATH_INFO"] = response.remaining_path    || ""
                    
          env['usher.params'].merge!(params)
          
          response.path.route.destination.call(env)
        end
      end

      def generate(route, params = nil, options = nil)
        @usher.generator.generate(route, params, options)
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
joshbuddy-usher-0.5.3 lib/usher/interface/rack_interface.rb
usher-0.5.3 lib/usher/interface/rack_interface.rb