class Rails::RFC6570::Visitor
Constants
- DISPATCH_CACHE
Public Class Methods
Source
# File lib/rails/rfc6570/visitor.rb, line 8 def initialize(factory: nil) super() @stack = [] @factory = factory || method(:symbolize) end
Calls superclass method
Public Instance Methods
Source
# File lib/rails/rfc6570/visitor.rb, line 15 def accept(node) Array(visit(node)).flatten end
Source
# File lib/rails/rfc6570/visitor.rb, line 26 def terminal(node) node.left end
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
Source
# 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
rubocop:disable Naming/MethodName
Source
# File lib/rails/rfc6570/visitor.rb, line 47 def visit_DOT(node) terminal(node) end
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
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
Source
# File lib/rails/rfc6570/visitor.rb, line 39 def visit_LITERAL(node) terminal(node) end
Source
# File lib/rails/rfc6570/visitor.rb, line 55 def visit_OR(_node) raise 'OR nodes cannot be serialized to URI templates' end
Source
# File lib/rails/rfc6570/visitor.rb, line 43 def visit_SLASH(node) terminal(node) end
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
Source
# File lib/rails/rfc6570/visitor.rb, line 93 def visit_SLASH_STAR(_slash, star) symbol(star.left, prefix: '/', suffix: '*') end
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
Source
# File lib/rails/rfc6570/visitor.rb, line 97 def visit_STAR_CAT(star, cat) [symbol(star.left, prefix: '/', suffix: '*'), visit(cat)] end
Source
# File lib/rails/rfc6570/visitor.rb, line 51 def visit_SYMBOL(node) symbol(node) end
Private Instance Methods
Source
# File lib/rails/rfc6570/visitor.rb, line 110 def symbol(node, **kwargs) @factory.call(node, **kwargs) end
Source
# File lib/rails/rfc6570/visitor.rb, line 114 def symbolize(node, prefix: nil, suffix: nil) "{#{prefix}#{node.name}#{suffix}}" end