require 'erb' # TODO: change method names to correct (CapitalCase and camelCase, not CamalCase and firstLower) class String def camel_case return self if self !~ /_/ && self =~ /[A-Z]+.*/ split('_').map{|e| e.capitalize}.join.upperize end def camel_case_lower self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join.upperize end def upperize self.sub('Id', 'ID').sub('Url', 'URL') end def first_lower self.sub(/^[A-Z]+/) {|f| f.downcase } end def underscore self.gsub(/::/, '/'). gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). gsub(/([a-z\d])([A-Z])/,'\1_\2'). tr("-", "_"). downcase end end class Attribute attr_reader :name, :type def initialize(name:, type:) @name = name @type = type end def type_js case @type when :int "number" when :uint "number" when :json # TODO # raise "Unexpected attribute type: data type attribute #{@name} found in JS template" "string" when :data raise "Unexpected attribute type: data type attribute #{@name} found in JS template" else @type end end def type_go case @type when :int 'int64' when :uint 'uint64' when :string 'string' when :data '[]byte' when :boolean 'bool' when :json 'interface{}' end end def lengh_encoded case @type when :string, :data true else false end end end $context = :web class Message attr_reader :id, :name, :js, :replayer, :swift, :seq_index, :attributes, :context def initialize(name:, id:, js: $context == :web, replayer: $context == :web, swift: $context == :ios, seq_index: false, &block) @id = id @name = name @js = js @replayer = replayer @swift = swift @seq_index = seq_index @context = $context @attributes = [] instance_eval &block end %i(int uint boolean string data).each do |type| define_method type do |name, opts = {}| opts.merge!( name: name, type: type, ) @attributes << Attribute.new(opts) end end end $ids = [] $messages = [] def message(id, name, opts = {}, &block) raise "id duplicated #{name}" if $ids.include? id raise "id is too big #{name}" if id > 120 $ids << id opts[:id] = id opts[:name] = name msg = Message.new(opts, &block) $messages << msg end require './messages.rb' $context = :ios require './ios_messages.rb' Dir["templates/*.erb"].each do |tpl| e = ERB.new(File.read(tpl)) path = tpl.split '/' t = '../' + path[1].gsub('~', '/') t = t[0..-5] File.write(t, e.result) puts tpl + ' --> ' + t end