import "github.com/cloudwego/dynamicgo/conv/p2j"
- type BinaryConv
- func NewBinaryConv(opts conv.Options) BinaryConv
- func (self *BinaryConv) Do(ctx context.Context, desc *proto.TypeDescriptor, pbytes []byte) (json []byte, err error)
- func (self *BinaryConv) DoInto(ctx context.Context, desc *proto.TypeDescriptor, pbytes []byte, buf *[]byte) (err error)
- func (self *BinaryConv) SetOptions(opts conv.Options)
type BinaryConv
type BinaryConv struct {
// contains filtered or unexported fields
}
func NewBinaryConv
func NewBinaryConv(opts conv.Options) BinaryConv
NewBinaryConv returns a new BinaryConv
func (*BinaryConv) Do
func (self *BinaryConv) Do(ctx context.Context, desc *proto.TypeDescriptor, pbytes []byte) (json []byte, err error)
Do converts protobuf binary (pbytes) to json bytes (jbytes) desc is the protobuf type descriptor of the protobuf binary, usually it is a response Message type
Example
package main
import (
"context"
"encoding/json"
"reflect"
"github.com/cloudwego/dynamicgo/conv"
"github.com/cloudwego/dynamicgo/internal/util_test"
"github.com/cloudwego/dynamicgo/proto"
"github.com/cloudwego/dynamicgo/testdata/kitex_gen/pb/example2"
goprotowire "google.golang.org/protobuf/encoding/protowire"
)
var opts = conv.Options{}
func main() {
// get descriptor and data
includeDirs := util_test.MustGitPath("testdata/idl/") // includeDirs is used to find the include files.
desc := proto.FnRequest(proto.GetFnDescFromFile(exampleIDLPath, "ExampleMethod", proto.Options{}, includeDirs))
// make BinaryConv
cv := NewBinaryConv(conv.Options{})
in := readExampleReqProtoBufData()
// do conversion
out, err := cv.Do(context.Background(), desc, in)
if err != nil {
panic(err)
}
exp := example2.ExampleReq{}
// use kitex_util to check proto data validity
l := 0
dataLen := len(in)
for l < dataLen {
id, wtyp, tagLen := goprotowire.ConsumeTag(in)
if tagLen < 0 {
panic("proto data error format")
}
l += tagLen
in = in[tagLen:]
offset, err := exp.FastRead(in, int8(wtyp), int32(id))
if err != nil {
panic(err)
}
in = in[offset:]
l += offset
}
if len(in) != 0 {
panic("proto data error format")
}
// validate result
var act example2.ExampleReq
err = json.Unmarshal([]byte(out), &act)
if err != nil {
panic(err)
}
if !reflect.DeepEqual(exp, act) {
panic("not equal")
}
}
func (*BinaryConv) DoInto
func (self *BinaryConv) DoInto(ctx context.Context, desc *proto.TypeDescriptor, pbytes []byte, buf *[]byte) (err error)
DoInto behaves like Do, but it writes the result to buffer directly instead of returning a new buffer
func (*BinaryConv) SetOptions
func (self *BinaryConv) SetOptions(opts conv.Options)
SetOptions sets options
Generated by gomarkdoc