class Apia::RouteSet

Attributes

controllers[R]
endpoints[R]
groups[R]
map[R]
routes[R]

Public Class Methods

new() click to toggle source
# File lib/apia/route_set.rb, line 14
def initialize
  @map = {}
  @routes = []
  @controllers = []
  @endpoints = []
  @groups = []
end
split_path(path) click to toggle source

Split a URL part into its appropriate parts

@param path [String] @return [Array<String>]

# File lib/apia/route_set.rb, line 82
def split_path(path)
  strip_slashes(path).split('/')
end
strip_slashes(string) click to toggle source

Remove slashes from the start and end of a given string

@param string [String] @return [String]

# File lib/apia/route_set.rb, line 74
def strip_slashes(string)
  string.sub(/\A\/+/, '').sub(/\/\z/, '')
end

Public Instance Methods

add(route) click to toggle source

Add a new route to the set

@param route [Moonstone::Route] @return [Moonstone::Route]

# File lib/apia/route_set.rb, line 30
def add(route)
  @routes << route
  if route.controller && !@controllers.include?(route.controller)
    @controllers << route.controller
  end

  if route.endpoint && !@controllers.include?(route.endpoint)
    @endpoints << route.endpoint
  end

  parts = self.class.split_path(route.path).map { |p| p =~ /\A:/ ? '?' : p }
  parts.size.times do |i|
    if i.zero?
      source = @map
    else
      source = @map.dig(*parts[0, i])
    end
    source[parts[i]] ||= { _routes: [] }
    source[parts[i]][:_routes] << route if i == parts.size - 1
  end
  route
end
dsl() click to toggle source
# File lib/apia/route_set.rb, line 22
def dsl
  @dsl ||= DSLs::RouteSet.new(self)
end
find(request_method, path) click to toggle source

Find routes that exactly match a given path

@param request_method [Symbol] @param path [String] @return [Array<Moonstone::Route>]

# File lib/apia/route_set.rb, line 58
def find(request_method, path)
  parts = self.class.split_path(path)
  last = @map
  parts.size.times do |i|
    last = last[parts[i]] || last['?']
    return [] if last.nil?
  end
  last[:_routes].select { |r| r.request_method == request_method }
end