File: template_generator.rb

package info (click to toggle)
ruby-mustermann19 0.4.3%2Bgit20160621-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 756 kB
  • ctags: 445
  • sloc: ruby: 7,197; makefile: 3
file content (28 lines) | stat: -rw-r--r-- 1,107 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
require 'mustermann/ast/translator'

module Mustermann
  module AST
    # Turns an AST into an Array of URI templates representing the AST.
    # @!visibility private
    # @see Mustermann::AST::Pattern#to_templates
    class TemplateGenerator < Translator
      # @!visibility private
      def self.generate_templates(ast)
        new.translate(ast).uniq
      end

      # translate(:expression) is not needed, since template patterns simply call to_s
      translate(:root, :group)        { t(payload) || [""]            }
      translate(:separator, :char)    { t.escape(payload)             }
      translate(:capture)             { "{#{name}}"                   }
      translate(:optional)            { [t(payload), ""]              }
      translate(:named_splat, :splat) { "{+#{name}}"                  }
      translate(:with_look_ahead)     { t([head, payload])            }
      translate(:union)               { payload.flat_map { |e| t(e) } }

      translate(Array) do
        map { |e| Array(t(e)) }.inject { |first, second| first.product(second).map(&:join) }
      end
    end
  end
end