class Controuter::Router

Public Class Methods

new(&block) click to toggle source
# File lib/controuter.rb, line 48
def initialize(&block)
  @routes = {}
  instance_exec(&block)
end

Public Instance Methods

call(env) click to toggle source
# File lib/controuter.rb, line 42
def call(env)
  find(env)
end

Private Instance Methods

find(env) click to toggle source
# File lib/controuter.rb, line 53
def find(env)
  current_env = ->(env) {[404, {}, ['404']]}
  @routes[env['REQUEST_METHOD']].each { |(key,value)|
    regular_value =  Regexp.new('\A' + key.gsub(/:[\w-]+/, '[\w-]+') + '\Z')
    current_env = get_controller_action(value) if regular_value=~env['REQUEST_PATH']
  }
  current_env.call(env)
end
get(path, rack_app) click to toggle source
# File lib/controuter.rb, line 74
def get(path, rack_app)
  match('GET', path, rack_app)
end
get_controller_action(str) click to toggle source
# File lib/controuter.rb, line 61
def get_controller_action(str)
  controller_name, action_name = str.split('#')
  controller_name = to_upper_camel_case(controller_name)
  Kernel.const_get(controller_name).send(:action, action_name)
end
match(http_method, path, rack_app) click to toggle source
# File lib/controuter.rb, line 82
def match(http_method, path, rack_app)
  @routes[http_method] ||= {}
  @routes[http_method][path] = rack_app
end
post(path, rack_app) click to toggle source
# File lib/controuter.rb, line 78
def post(path, rack_app)
  match('POST', path, rack_app)
end
to_upper_camel_case(str) click to toggle source
# File lib/controuter.rb, line 67
def to_upper_camel_case(str)
  str
    .split('/')
    .map { |part| part.split('_').map(&:capitalize).join }
    .join('::') + 'Controller'
end