func TestMeta(t *testing.T) { // 请先运行ExportPluginMeta导出test.pb fds, err := pbmeta.LoadFileDescriptorSet("test.pb") if err != nil { t.Error(err) return } // 描述池 pool := pbmeta.NewDescriptorPool(fds) // 取消息 m := pool.MessageByFullName("test.TestStruct") if m == nil { t.Fail() return } // 检查Comment读取正确 if "FieldA comment" != m.FieldByName("FieldA").CommentMeta.TrailingComment() { t.Fail() return } }
func main() { gen := New() // 读取protoc请求 data, err := ioutil.ReadAll(os.Stdin) if err != nil { gen.Error(err, "reading input") } // 解析请求 if err := proto.Unmarshal(data, gen.Request); err != nil { gen.Error(err, "parsing input proto") } if len(gen.Request.FileToGenerate) == 0 { gen.Fail("no files to generate") } // 启用带has字段的生成 if gen.Request.GetParameter() == "use_hasfield" { use_hasField = true } // 建立解析池 pool := pbmeta.NewDescriptorPool(&pbprotos.FileDescriptorSet{ File: gen.Request.ProtoFile, }) gen.Response.File = make([]*plugin.CodeGeneratorResponse_File, 0) for i := 0; i < pool.FileCount(); i++ { file := pool.File(i) gen.Reset() printFile(gen, file) gen.Response.File = append(gen.Response.File, &plugin.CodeGeneratorResponse_File{ Name: proto.String(csFileName(file.FileName())), Content: proto.String(gen.String()), }) } // 发回处理结果 data, err = proto.Marshal(gen.Response) if err != nil { gen.Error(err, "failed to marshal output proto") } _, err = os.Stdout.Write(data) if err != nil { gen.Error(err, "failed to write output proto") } }