diff --git a/gen/gen.sh b/gen/gen.sh old mode 100644 new mode 100755 diff --git a/gen/gen_from_vmodl.rb b/gen/gen_from_vmodl.rb index ee1dddc35..18c6f769e 100644 --- a/gen/gen_from_vmodl.rb +++ b/gen/gen_from_vmodl.rb @@ -191,15 +191,15 @@ def managed wsdl.validate_assumptions! wsdl.peek() -mo_go = File.open(File.join(ARGV.first, "mo/mo.go"), "w") -io = mo_go -io.print "package mo\n\n" +File.open(File.join(ARGV.first, "mo/mo.go"), "w") do |io| + io.print WSDL.header("mo") -vmodl = Vmodl.new(read "vmodl.db") + vmodl = Vmodl.new(read "vmodl.db") -vmodl. - managed. - sort_by { |m| m.name }. - each { |m| m.dump(io) } + vmodl. + managed. + sort_by { |m| m.name }. + each { |m| m.dump(io) } +end exit(0) diff --git a/gen/gen_from_wsdl.rb b/gen/gen_from_wsdl.rb index 3fa3125de..341d7436a 100644 --- a/gen/gen_from_wsdl.rb +++ b/gen/gen_from_wsdl.rb @@ -27,50 +27,56 @@ ifs = Peek.types.keys.select { |name| Peek.base?(name) }.size() puts "%d classes, %d interfaces" % [Peek.types.size(), ifs] -types_go = File.open(File.join(ARGV.first, "types/types.go"), "w") -io = types_go -io.print "package types\n\n" - -wsdl. - types. - sort_by { |x| x.name }. - uniq { |x| x.name }. - select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... - select { |t| t.is_enum? }. - each { |e| e.dump(io); e.dump_init(io) } - -wsdl. - types. - sort_by { |x| x.name }. - uniq { |x| x.name }. - select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... - select { |t| !t.is_enum? }. - each { |e| e.dump(io); e.dump_init(io) } - -if_go = File.open(File.join(ARGV.first, "types/if.go"), "w") -io = if_go -io.print "package types\n\n" -Peek.dump_interfaces(io) - -methods_go = File.open(File.join(ARGV.first, "methods/methods.go"), "w") -io = methods_go -io.print "package methods\n\n" - -wsdl. - operations. - sort_by { |x| x.name }. - select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... - each { |e| e.dump(io) } - -methods_go = File.open(File.join(ARGV.first, "tasks/tasks.go"), "w") -io = methods_go -io.print "package tasks\n\n" - -wsdl. - operations. - sort_by { |x| x.name }. - select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... - select { |x| x.name =~ /_Task$/ }. - each { |e| e.dump_task(io) } +File.open(File.join(ARGV.first, "types/enum.go"), "w") do |io| + io.print WSDL.header("types") + + wsdl. + types. + sort_by { |x| x.name }. + uniq { |x| x.name }. + select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... + select { |t| t.is_enum? }. + each { |e| e.dump(io); e.dump_init(io) } +end + +File.open(File.join(ARGV.first, "types/types.go"), "w") do |io| + io.print WSDL.header("types") + + wsdl. + types. + sort_by { |x| x.name }. + uniq { |x| x.name }. + select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... + select { |t| !t.is_enum? }. + each { |e| e.dump(io); e.dump_init(io) } +end + +File.open(File.join(ARGV.first, "types/if.go"), "w") do |io| + io.print WSDL.header("types") + + Peek.dump_interfaces(io) +end + +File.open(File.join(ARGV.first, "methods/methods.go"), "w") do |io| + io.print WSDL.header("methods") + + wsdl. + operations. + sort_by { |x| x.name }. + select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... + each { |e| e.dump(io) } +end + + +File.open(File.join(ARGV.first, "tasks/tasks.go"), "w") do |io| + io.print WSDL.header("tasks") + + wsdl. + operations. + sort_by { |x| x.name }. + select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... + select { |x| x.name =~ /_Task$/ }. + each { |e| e.dump_task(io) } +end exit(0) diff --git a/gen/vim_wsdl.rb b/gen/vim_wsdl.rb index d5e07a1c1..b6c57a6ce 100644 --- a/gen/vim_wsdl.rb +++ b/gen/vim_wsdl.rb @@ -34,6 +34,7 @@ def base? @@types = {} @@refs = {} + @@enums = {} def self.types return @@types @@ -43,10 +44,22 @@ def self.refs return @@refs end + def self.enums + return @@enums + end + def self.ref(type) refs[type] = true end + def self.enum(type) + enums[type] = true + end + + def self.enum?(type) + enums[type] + end + def self.register(name) raise unless name types[name] ||= Type.new() @@ -144,6 +157,10 @@ def base_type? vim_type? && Peek.base?(vim_type) end + def enum_type? + vim_type? && Peek.enum?(vim_type) + end + def any_type? self.type == "xsd:anyType" end @@ -185,7 +202,7 @@ def var_type if base_type? prefix += "Base" else - prefix += "*" if !slice? && optional? + prefix += "*" if !slice? && !enum_type? && optional? end end @@ -294,7 +311,7 @@ def dump(io) end io.print "type %s string\n\n" % name - io.print "var (\n" + io.print "const (\n" enums.each { |e| e.dump(io) } io.print ")\n\n" end @@ -304,6 +321,10 @@ def dump_init(io) io.print "t[\"%s\"] = reflect.TypeOf((*%s)(nil)).Elem()\n" % [name, name] io.print "}\n\n" end + + def peek + Peek.enum(name) + end end class ComplexType < Simple @@ -707,7 +728,29 @@ def peek sort_by { |x| x.name }. uniq { |x| x.name }. select { |x| x.name[0] == x.name[0].upcase }. # Only capitalized methods for now... - select { |t| !t.is_enum? }. each { |e| e.peek() } end + + def self.header(name) + return <