class Mustermann::AST::Translator
Implements translator pattern
@abstract @!visibility private
Constants
- URI_PARSER
Public Class Methods
Source
# File lib/mustermann/ast/translator.rb, line 98 def self.create(&block) Class.new(self, &block).new end
Enables quick creation of a translator object.
@example
require 'mustermann' require 'mustermann/ast/translator' translator = Mustermann::AST::Translator.create do translate(:node) { [type, *t(payload)].flatten.compact } translate(Array) { map { |e| t(e) } } translate(Object) { } end ast = Mustermann.new('/:name').to_ast translator.translate(ast) # => [:root, :separator, :capture]
@!visibility private
Source
# File lib/mustermann/ast/translator.rb, line 54 def self.dispatch_table @dispatch_table ||= {} end
maps types to translations @!visibility private
Source
# File lib/mustermann/ast/translator.rb, line 60 def self.inherited(subclass) node_translator = Class.new(NodeTranslator) node_translator.define_singleton_method(:translator) { subclass } subclass.const_set(:NodeTranslator, node_translator) super end
some magic sauce so {NodeTranslator}s know whom to talk to for {#register} @!visibility private
Calls superclass method
Source
# File lib/mustermann/ast/translator.rb, line 69 def self.raises(error) define_method(:error_class) { error } end
DSL-ish method for specifying the exception class to use. @!visibility private
Source
# File lib/mustermann/ast/translator.rb, line 75 def self.translate(*types, &block) Class.new(const_get(:NodeTranslator)) do register(*types) define_method(:translate, &block) end end
DSL method for defining single method translations. @!visibility private
Public Instance Methods
Source
# File lib/mustermann/ast/translator.rb, line 108 def decorator_for(node) factory = node.class.ancestors.inject(nil) { |d,a| d || self.class.dispatch_table[a.name] } raise error_class, "#{self.class}: Cannot translate #{node.class}" unless factory factory.new(node, self) end
@param [Mustermann::AST::Node, Object] node to translate @return decorator encapsulating translation
@!visibility private
Source
# File lib/mustermann/ast/translator.rb, line 124 def escape(char, parser: URI_PARSER, escape: URI_PARSER.regexp[:UNSAFE], also_escape: nil) escape = Regexp.union(also_escape, escape) if also_escape char.to_s =~ escape ? parser.escape(char, Regexp.union(*escape)) : char end
@return [String] escaped character @!visibility private
Source
# File lib/mustermann/ast/translator.rb, line 116 def translate(node, *args, &block) result = decorator_for(node).translate(*args, &block) result = result.node while result.is_a? NodeTranslator result end