class Rails::RFC6570::Visitor

Constants

DISPATCH_CACHE

Public Class Methods

new(factory: nil) click to toggle source
Calls superclass method
# File lib/rails/rfc6570/visitor.rb, line 8
def initialize(factory: nil)
  super()

  @stack   = []
  @factory = factory || method(:symbolize)
end

Public Instance Methods

accept(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 15
def accept(node)
  Array(visit(node)).flatten
end
terminal(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 26
def terminal(node)
  node.left
end
visit(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 19
def visit(node)
  @stack.unshift node.type
  send DISPATCH_CACHE.fetch(node.type), node
ensure
  @stack.shift
end
visit_CAT(node) click to toggle source

rubocop:disable Naming/MethodName

# File lib/rails/rfc6570/visitor.rb, line 31
def visit_CAT(node)
  if (mth = DISPATCH_CACHE[:"#{node.left.type}_#{node.right.type}"])
    send mth, node.left, node.right
  else
    [visit(node.left), visit(node.right)]
  end
end
visit_DOT(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 47
def visit_DOT(node)
  terminal(node)
end
visit_DOT_SYMBOL(dot, node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 67
def visit_DOT_SYMBOL(dot, node)
  if @stack[0..1] == %i[CAT GROUP]
    symbol(node, prefix: '.')
  else
    [visit(dot), visit(node)]
  end
end
visit_GROUP(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 59
def visit_GROUP(node)
  # if @stack.include?(:GROUP) && @stack[1..-1].include?(:GROUP)
  #   raise 'Cannot transform nested groups.'
  # end

  visit node.left
end
visit_LITERAL(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 39
def visit_LITERAL(node)
  terminal(node)
end
visit_OR(_node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 55
def visit_OR(_node)
  raise 'OR nodes cannot be serialized to URI templates'
end
visit_SLASH(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 43
def visit_SLASH(node)
  terminal(node)
end
visit_SLASH_CAT(slash, cat) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 83
def visit_SLASH_CAT(slash, cat)
  if cat.left.type == :STAR
    [symbol(cat.left.left, prefix: '/', suffix: '*'), visit(cat.right)]
  elsif cat.left.type == :SYMBOL && @stack[0..1] == %i[CAT GROUP]
    [symbol(cat.left, prefix: '/'), visit(cat.right)]
  else
    [visit(slash), visit(cat)]
  end
end
visit_SLASH_STAR(_slash, star) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 93
def visit_SLASH_STAR(_slash, star)
  symbol(star.left, prefix: '/', suffix: '*')
end
visit_SLASH_SYMBOL(slash, node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 75
def visit_SLASH_SYMBOL(slash, node)
  if @stack[0..1] == %i[CAT GROUP]
    symbol(node, prefix: '/')
  else
    [visit(slash), visit(node)]
  end
end
visit_STAR_CAT(star, cat) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 97
def visit_STAR_CAT(star, cat)
  [symbol(star.left, prefix: '/', suffix: '*'), visit(cat)]
end
visit_SYMBOL(node) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 51
def visit_SYMBOL(node)
  symbol(node)
end

Private Instance Methods

symbol(node, **kwargs) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 110
def symbol(node, **kwargs)
  @factory.call(node, **kwargs)
end
symbolize(node, prefix: nil, suffix: nil) click to toggle source
# File lib/rails/rfc6570/visitor.rb, line 114
def symbolize(node, prefix: nil, suffix: nil)
  "{#{prefix}#{node.name}#{suffix}}"
end