Sha256: 42d18648c22569ec6bf6042b539a07f8ab09c89cbbed5e3bd66f1067d4272118

Contents?: true

Size: 1.83 KB

Versions: 3

Compression:

Stored size: 1.83 KB

Contents

# need to define class immediately b/c of circular requires:
# - runner -> router -> route -> sanford_runner -> runner
module Sanford; end
class Sanford::Runner; end

require 'sanford-protocol'
require 'sanford/logger'
require 'sanford/router'
require 'sanford/template_source'

module Sanford

  class Runner

    ResponseArgs = Struct.new(:status, :data)

    attr_reader :handler_class, :handler
    attr_reader :request, :params, :logger, :router, :template_source

    def initialize(handler_class, args = nil)
      @handler_class = handler_class

      a = args || {}
      @request         = a[:request]
      @params          = a[:params] || {}
      @logger          = a[:logger] || Sanford::NullLogger.new
      @router          = a[:router] || Sanford::Router.new
      @template_source = a[:template_source] || Sanford::NullTemplateSource.new

      @handler = @handler_class.new(self)
    end

    def run
      raise NotImplementedError
    end

    def render(path, locals = nil)
      self.template_source.render(path, self.handler, locals || {})
    end

    # It's best to keep what `halt` and `catch_halt` return in the same format.
    # Currently this is a `ResponseArgs` object. This is so no matter how the
    # block returns (either by throwing or running normally), you get the same
    # thing kind of object.

    def halt(status, options = nil)
      options ||= {}
      message = options[:message] || options['message']
      response_status = [ status, message ]
      response_data = options[:data] || options['data']
      throw :halt, ResponseArgs.new(response_status, response_data)
    end

    private

    def catch_halt(&block)
      catch(:halt){ ResponseArgs.new(*block.call) }
    end

    def build_response(&block)
      args = catch_halt(&block)
      Sanford::Protocol::Response.new(args.status, args.data)
    end

  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
sanford-0.15.1 lib/sanford/runner.rb
sanford-0.15.0 lib/sanford/runner.rb
sanford-0.14.0 lib/sanford/runner.rb