Exemplo n.º 1
0
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
	}

}
Exemplo n.º 2
0
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")
	}

}