func (p *test) Generate(imports generator.PluginImports, file *generator.FileDescriptor) bool { used := false testingPkg := imports.NewImport("testing") for _, message := range file.Messages() { if !gogoproto.HasDescription(file.FileDescriptorProto, message.DescriptorProto) || !gogoproto.HasTestGen(file.FileDescriptorProto, message.DescriptorProto) { continue } if message.DescriptorProto.GetOptions().GetMapEntry() { continue } used = true } if used { localName := generator.FileName(file) p.P(`func Test`, localName, `Description(t *`, testingPkg.Use(), `.T) {`) p.In() p.P(localName, `Description()`) p.Out() p.P(`}`) } return used }
func (p *plugin) Generate(file *generator.FileDescriptor) { used := false localName := generator.FileName(file) p.PluginImports = generator.NewPluginImports(p.Generator) descriptorPkg := p.NewImport("limbo.services/protobuf/protoc-gen-gogo/descriptor") protoPkg := p.NewImport("limbo.services/protobuf/proto") gzipPkg := p.NewImport("compress/gzip") bytesPkg := p.NewImport("bytes") ioutilPkg := p.NewImport("io/ioutil") for _, message := range file.Messages() { if !gogoproto.HasDescription(file.FileDescriptorProto, message.DescriptorProto) { continue } if message.DescriptorProto.GetOptions().GetMapEntry() { continue } used = true ccTypeName := generator.CamelCaseSlice(message.TypeName()) p.P(`func (this *`, ccTypeName, `) Description() (desc *`, descriptorPkg.Use(), `.FileDescriptorSet) {`) p.In() p.P(`return `, localName, `Description()`) p.Out() p.P(`}`) } if used { p.P(`func `, localName, `Description() (desc *`, descriptorPkg.Use(), `.FileDescriptorSet) {`) p.In() //Don't generate SourceCodeInfo, since it will create too much code. ss := make([]*descriptor.SourceCodeInfo, 0) for _, f := range p.Generator.AllFiles().GetFile() { ss = append(ss, f.SourceCodeInfo) f.SourceCodeInfo = nil } b, err := proto.Marshal(p.Generator.AllFiles()) if err != nil { panic(err) } for i, f := range p.Generator.AllFiles().GetFile() { f.SourceCodeInfo = ss[i] } p.P(`d := &`, descriptorPkg.Use(), `.FileDescriptorSet{}`) var buf bytes.Buffer w, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression) w.Write(b) w.Close() b = buf.Bytes() p.P("var gzipped = []byte{") p.In() p.P("// ", len(b), " bytes of a gzipped FileDescriptorSet") for len(b) > 0 { n := 16 if n > len(b) { n = len(b) } s := "" for _, c := range b[:n] { s += fmt.Sprintf("0x%02x,", c) } p.P(s) b = b[n:] } p.Out() p.P("}") p.P(`r := `, bytesPkg.Use(), `.NewReader(gzipped)`) p.P(`gzipr, err := `, gzipPkg.Use(), `.NewReader(r)`) p.P(`if err != nil {`) p.In() p.P(`panic(err)`) p.Out() p.P(`}`) p.P(`ungzipped, err := `, ioutilPkg.Use(), `.ReadAll(gzipr)`) p.P(`if err != nil {`) p.In() p.P(`panic(err)`) p.Out() p.P(`}`) p.P(`if err := `, protoPkg.Use(), `.Unmarshal(ungzipped, d); err != nil {`) p.In() p.P(`panic(err)`) p.Out() p.P(`}`) p.P(`return d`) p.Out() p.P(`}`) } }