Class: Lydia::Router

Inherits:
Object
  • Object
show all
Includes:
StandardPages
Defined in:
lib/lydia/router.rb

Direct Known Subclasses

Application

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from StandardPages

#halted, #internal_server_error, #not_found

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



12
13
14
# File 'lib/lydia/router.rb', line 12

def env
  @env
end

#requestObject (readonly)

Returns the value of attribute request.



12
13
14
# File 'lib/lydia/router.rb', line 12

def request
  @request
end

#responseObject (readonly)

Returns the value of attribute response.



12
13
14
# File 'lib/lydia/router.rb', line 12

def response
  @response
end

Class Method Details

.namespace(pattern, _options = {}) ⇒ Object



25
26
27
28
29
30
# File 'lib/lydia/router.rb', line 25

def namespace(pattern, _options = {})
  prev_namespace = @namespace ||= ''
  @namespace += pattern
  yield
  @namespace = prev_namespace
end

.routesObject



15
16
17
# File 'lib/lydia/router.rb', line 15

def routes
  @routes ||= Hash.new { |h, k| h[k] = [] }
end

Instance Method Details

#_call(env) ⇒ Object



45
46
47
48
49
50
# File 'lib/lydia/router.rb', line 45

def _call(env)
  @env = env
  @request = new_request(env)
  @response = new_response
  process
end

#call(env) ⇒ Object



41
42
43
# File 'lib/lydia/router.rb', line 41

def call(env)
  dup._call(env)
end

#dispatch(env) ⇒ Object

Raises:



74
75
76
77
78
79
80
81
82
83
# File 'lib/lydia/router.rb', line 74

def dispatch(env)
  routes[env['REQUEST_METHOD']].each do |route|
    next unless route.match?(env)
    @request.params.merge!(route.params) if route.params
    catch(:next_route) do
      return instance_eval(&route.block)
    end
  end
  raise(NotFound, 'Not found')
end

#halt(input = nil) ⇒ Object

Raises:



37
38
39
# File 'lib/lydia/router.rb', line 37

def halt(input = nil)
  raise(Halted.new(input || halted), 'Halt')
end

#new_request(env) ⇒ Object



52
53
54
# File 'lib/lydia/router.rb', line 52

def new_request(env)
  Rack::Request.new(env)
end

#new_response(body = [], status = 200, header = {}) ⇒ Object



56
57
58
# File 'lib/lydia/router.rb', line 56

def new_response(body = [], status = 200, header = {})
  Rack::Response.new(body, status, header)
end

#next_routeObject



33
34
35
# File 'lib/lydia/router.rb', line 33

def next_route
  throw :next_route
end

#processObject



60
61
62
63
64
65
66
67
68
# File 'lib/lydia/router.rb', line 60

def process
  dispatch(env)
rescue NotFound
  not_found(env)
rescue Halted => exception
  exception.content
rescue StandardError => exception
  internal_server_error(env, exception)
end

#routesObject



70
71
72
# File 'lib/lydia/router.rb', line 70

def routes
  self.class.routes
end