class GoonModelGen::Builder::AbstractBuilder
Attributes
base_package_path[R]
config[R]
package_suffix[RW]
Public Class Methods
new(config, base_package_path)
click to toggle source
@param config [GoonModelGen::Config] @param base_package_path
[String]
# File lib/goon_model_gen/builder/abstract_builder.rb, line 15 def initialize(config, base_package_path) @config = config @base_package_path = base_package_path end
Public Instance Methods
build(context)
click to toggle source
@param context [Source::Context] @return [Golang::Packages]
# File lib/goon_model_gen/builder/abstract_builder.rb, line 22 def build(context) Golang::Packages.new.tap do |r| build_sentences = [] context.files.each do |f| package_path = File.join(base_package_path, f.basename + (package_suffix || "")) pkg, procs = build_package(package_path, f.types) r << pkg build_sentences.concat(procs) end resolve_type_names(r) build_sentences.each(&:call) end end
build_package(package_path, types)
click to toggle source
@param package_path [String] @param types [Array<Source::Type>] @return [Golang::Package, Array<Proc>]
# File lib/goon_model_gen/builder/abstract_builder.rb, line 39 def build_package(package_path, types) raise NotImplementedError, "#{self.type.name} doesn't implement build_package method" end
build_sentences(action, kind, t, go_type)
click to toggle source
@param action [string] directory name under templates directory. ex. model, store… @param kind [string] directory name under the directory specified by action. ex. goon, struct, enum, slice @param t [Source::Struct] @param go_type [Golang::Type]
# File lib/goon_model_gen/builder/abstract_builder.rb, line 52 def build_sentences(action, kind, t, go_type) template_base = File.join(action, kind) build_sentences_with(template_base, go_type, t.generators[action]) end
build_sentences_with(template_base, go_type, generators)
click to toggle source
@param template_base [string] template directory path from templates directory. ex. model/enum, store/goon… @param generators [Hash<string,Object>] @param go_type [Golang::Type]
# File lib/goon_model_gen/builder/abstract_builder.rb, line 60 def build_sentences_with(template_base, go_type, generators) m2t = method_to_template_for(template_base) generators ||= m2t.keys.each_with_object({}){|name, d| d[name] = true } m2t.each do |name, template| suffix = generators[name] next if !suffix raise "No template found for #{name.inspect}" unless template parts = [go_type.name.underscore] custom_suffix = false if suffix.is_a?(String) parts << suffix custom_suffix = true end filename = parts.join('_') << '.go' go_type.package.find_or_new_file(filename).tap do |file| file.custom_suffix = custom_suffix file.new_sentence(File.join(template_base, template), go_type) end end end
method_to_template_for(template_base)
click to toggle source
# File lib/goon_model_gen/builder/abstract_builder.rb, line 86 def method_to_template_for(template_base) method_to_template_map[template_base] ||= begin templates_for(template_base).each_with_object({}) do |filename, d| m = filename.sub(/\A\d+\_/, '').sub(/\.go\.erb\z/, '') d[m] = filename end end end
method_to_template_map()
click to toggle source
# File lib/goon_model_gen/builder/abstract_builder.rb, line 82 def method_to_template_map @method_to_template_map ||= {} end
resolve_type_names(pkgs)
click to toggle source
@param pkgs [Golang::Packages]
# File lib/goon_model_gen/builder/abstract_builder.rb, line 44 def resolve_type_names(pkgs) raise NotImplementedError, "#{self.type.name} doesn't implement resolve_type_names method" end
templates_for(template_base)
click to toggle source
# File lib/goon_model_gen/builder/abstract_builder.rb, line 96 def templates_for(template_base) base_dir = File.join(File.expand_path('../../templates', __FILE__), template_base) Dir.chdir(base_dir) do Dir.glob('*.go.erb') end end