import "github.com/cloudwego/dynamicgo/conv/j2p"
type BinaryConv
BinaryConv is a converter from json to protobuf binary
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, jbytes []byte) (tbytes []byte, err error)
Do converts json bytes (jbytes) to protobuf binary (tbytes) desc is the protobuf type descriptor of the protobuf binary, usually it the request Message type
Example
package main
import (
"context"
"encoding/json"
"reflect"
"github.com/cloudwego/dynamicgo/conv"
"github.com/cloudwego/dynamicgo/testdata/kitex_gen/pb/example2"
"google.golang.org/protobuf/encoding/protowire"
)
var opts = conv.Options{}
func main() {
// get descriptor and data
desc := getExampleDesc()
data := getExampleData()
// make BinaryConv
cv := NewBinaryConv(opts)
// do conversion
out, err := cv.Do(context.Background(), desc, data)
if err != nil {
panic(err)
}
// validate result
exp := &example2.ExampleReq{}
err = json.Unmarshal(data, exp)
if err != nil {
panic(err)
}
act := &example2.ExampleReq{}
l := 0
dataLen := len(out)
// fastRead to get target struct
for l < dataLen {
id, wtyp, tagLen := protowire.ConsumeTag(out)
if tagLen < 0 {
panic("parseTag failed")
}
l += tagLen
out = out[tagLen:]
offset, err := act.FastRead(out, int8(wtyp), int32(id))
if err != nil {
panic(err)
}
out = out[offset:]
l += offset
}
if !reflect.DeepEqual(exp, act) {
panic("not equal")
}
}
func (*BinaryConv) DoInto
func (self *BinaryConv) DoInto(ctx context.Context, desc *proto.TypeDescriptor, jbytes []byte, buf *[]byte) error
DoInto behaves like Do, but it writes the result to buffer directly instead of returning a new buffer
Generated by gomarkdoc