Skip to content

Latest commit

 

History

History
122 lines (92 loc) · 2.91 KB

README.md

File metadata and controls

122 lines (92 loc) · 2.91 KB

j2p

import "github.com/cloudwego/dynamicgo/conv/j2p"

Index

BinaryConv is a converter from json to protobuf binary

type BinaryConv struct {
    // contains filtered or unexported fields
}

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