diff --git a/Makefile b/Makefile index 6139c70..6a6aaa2 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ release: gen-go-proto: @protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ - reflect/gen/user.proto + reflect/gen/test.proto gen-log-proto: @protoc --go_out=. --go_opt=paths=source_relative \ diff --git a/go.mod b/go.mod index 306395f..53eb1a6 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/jhump/protoreflect v1.10.1 github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.5.1 // indirect + github.com/stretchr/testify v1.5.1 github.com/urfave/cli/v2 v2.3.0 google.golang.org/grpc v1.38.0 google.golang.org/protobuf v1.27.1 diff --git a/go.sum b/go.sum index e39e55b..4f00c2d 100644 --- a/go.sum +++ b/go.sum @@ -2,13 +2,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT fyne.io/fyne/v2 v2.1.1 h1:3p39SwQ/rBiYODVYI4ggTuwMufWYmqaRMJvXTFg7jSw= fyne.io/fyne/v2 v2.1.1/go.mod h1:c1vwI38Ebd0dAdxVa6H1Pj6/+cK1xtDy61+I31g+s14= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9 h1:1ltqoej5GtaWF8jaiA49HwsZD459jqm9YFz9ZtMFpQA= github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cheggaaa/pb/v3 v3.0.5 h1:lmZOti7CraK9RSjzExsY53+WWfub9Qv13B5m4ptEoPE= @@ -37,7 +34,6 @@ github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f h1:s0O46d8fPwk9kU4k1jj76w github.com/go-gl/gl v0.0.0-20210813123233-e4099ee2221f/go.mod h1:wjpnOv6ONl2SuJSxqCPVaPZibGFdSci9HFocT9qtVYM= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -67,18 +63,15 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526 h1:NfuKjkj/Xc2z1xZIj+EmNCm5p1nKJPyw3F4E20usXvg= github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc= github.com/jhump/protoreflect v1.10.1 h1:iH+UZfsbRE6vpyZH7asAjTPWJf7RJbpZ9j/N3lDlKs0= github.com/jhump/protoreflect v1.10.1/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= -github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca h1:ozPUX9TKQZVek4lZWYRsQo7uS8vJ+q4OOHvRhHiCLfU= github.com/josephspurrier/goversioninfo v0.0.0-20200309025242-14b0ab84c6ca/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lucor/goinfo v0.0.0-20210802170112-c078a2b0f08b h1:tLSDWcFhT0WRlnsFszh4iaFTexWF8mmccGTk88Siq7Q= github.com/lucor/goinfo v0.0.0-20210802170112-c078a2b0f08b/go.mod h1:PRq09yoB+Q2OJReAmwzKivcYyremnibWGbK7WfftHzc= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= @@ -89,7 +82,6 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -135,7 +127,6 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -181,7 +172,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/gui/call/stream_call.go b/gui/call/stream_call.go new file mode 100644 index 0000000..08694b3 --- /dev/null +++ b/gui/call/stream_call.go @@ -0,0 +1,258 @@ +package call + +import ( + "context" + "encoding/json" + "fmt" + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" + "github.com/crossoverJie/ptg/reflect" + "github.com/golang/protobuf/proto" + "github.com/jhump/protoreflect/desc" + "github.com/jhump/protoreflect/dynamic/grpcdynamic" + "io" +) + +type ( + Call struct { + parse *reflect.ParseReflect + responseEntry, requestEntry *widget.Entry + processBar *widget.ProgressBarInfinite + mds *desc.MethodDescriptor + stub grpcdynamic.Stub + errorHandle errorHandle + } + errorHandle func(window fyne.Window, processBar *widget.ProgressBarInfinite, err error) +) + +func NewCallBuilder() *Call { + return &Call{} +} +func (c *Call) Parse(parse *reflect.ParseReflect) *Call { + c.parse = parse + return c +} +func (c *Call) ResponseEntry(responseEntry *widget.Entry) *Call { + c.responseEntry = responseEntry + return c +} +func (c *Call) Mds(mds *desc.MethodDescriptor) *Call { + c.mds = mds + return c +} +func (c *Call) Stub(stub grpcdynamic.Stub) *Call { + c.stub = stub + return c +} +func (c *Call) RequestEntry(requestEntry *widget.Entry) *Call { + c.requestEntry = requestEntry + return c +} +func (c *Call) ProcessBar(processBar *widget.ProgressBarInfinite) *Call { + c.processBar = processBar + return c +} +func (c *Call) ErrorHandle(e errorHandle) *Call { + c.errorHandle = e + return c +} + +func (c *Call) Run(ctx context.Context) (string, error) { + c.responseEntry.SetText("") + mds := c.mds + parse := c.parse + responseEntry := c.responseEntry + stub := c.stub + data := c.requestEntry.Text + + if !mds.IsClientStreaming() && !mds.IsServerStreaming() { + // unary RPC + rpc, err := parse.InvokeRpc(ctx, stub, mds, data) + if err != nil { + return "", err + } + viewCallBack := &unaryCallBack{} + return viewCallBack.ViewCallBack(rpc, responseEntry), nil + } + + if !mds.IsClientStreaming() && mds.IsServerStreaming() { + // server stream + rpc, err := parse.InvokeServerStreamRpc(ctx, stub, mds, data) + if err != nil { + return "", err + } + viewCallBack := &serverStreamCallBack{ + ch: make(chan proto.Message, 10), + responseEntry: responseEntry, + } + viewCallBack.receive() + for { + msg, err := rpc.RecvMsg() + fmt.Printf("stream call %s \n", msg) + if err == io.EOF { + close(viewCallBack.ch) + } + if err != nil { + return "", nil + } + viewCallBack.ViewCallBack(msg, responseEntry) + } + + } + + if mds.IsClientStreaming() && !mds.IsServerStreaming() { + // client stream + rpc, err := parse.InvokeClientStreamRpc(ctx, stub, mds) + if err != nil { + return "", err + } + w := fyne.CurrentApp().NewWindow("Client stream call") + w.Resize(fyne.NewSize(300, 100)) + request := widget.NewMultiLineEntry() + request.SetText(data) + var totalRequest string + requestButton := widget.NewButtonWithIcon("Push", theme.MediaPlayIcon(), func() { + messages, err := reflect.CreatePayloadsFromJSON(mds, request.Text) + if err != nil { + c.errorHandle(w, c.processBar, err) + return + } + rpc.SendMsg(messages[0]) + totalRequest += request.Text + "\n" + }) + finishButton := widget.NewButtonWithIcon("Finish", theme.ConfirmIcon(), func() { + receive, err := rpc.CloseAndReceive() + if err != nil { + c.errorHandle(w, c.processBar, err) + return + } + marshalIndent, _ := json.MarshalIndent(receive, "", "\t") + c.responseEntry.SetText(string(marshalIndent)) + w.Close() + c.requestEntry.SetText(totalRequest) + + }) + w.SetContent(container.NewVBox(request, requestButton, finishButton)) + w.CenterOnScreen() + w.Show() + + } + if mds.IsClientStreaming() && mds.IsServerStreaming() { + // bidi stream + rpc, err := parse.InvokeBidiStreamRpc(ctx, stub, mds) + if err != nil { + return "", err + } + w := fyne.CurrentApp().NewWindow("Bidi stream call") + w.Resize(fyne.NewSize(300, 100)) + request := widget.NewMultiLineEntry() + request.SetText(data) + var totalRequest string + + streamCallBack := bidiStreamCallBack{ + ch: make(chan proto.Message, 10), + responseEntry: responseEntry, + } + streamCallBack.receive() + + requestButton := widget.NewButtonWithIcon("Push", theme.MediaPlayIcon(), func() { + messages, err := reflect.CreatePayloadsFromJSON(mds, request.Text) + if err != nil { + c.errorHandle(w, c.processBar, err) + return + } + rpc.SendMsg(messages[0]) + totalRequest += request.Text + "\n" + + receive, _ := rpc.RecvMsg() + streamCallBack.ViewCallBack(receive) + }) + finishButton := widget.NewButtonWithIcon("Finish", theme.ConfirmIcon(), func() { + err := rpc.CloseSend() + if err != nil { + c.errorHandle(w, c.processBar, err) + return + } + w.Close() + c.requestEntry.SetText(totalRequest) + + }) + w.SetContent(container.NewVBox(request, requestButton, finishButton)) + w.CenterOnScreen() + w.Show() + } + + return "", nil +} + +type unaryCallBack struct{} + +func (u unaryCallBack) ViewCallBack(message proto.Message, responseEntry *widget.Entry) string { + marshalIndent, _ := json.MarshalIndent(message, "", "\t") + responseEntry.SetText(string(marshalIndent)) + return string(marshalIndent) +} + +type serverStreamCallBack struct { + ch chan proto.Message + responseEntry *widget.Entry +} + +func (s *serverStreamCallBack) ViewCallBack(message proto.Message, responseEntry *widget.Entry) string { + s.ch <- message + return "" +} + +func (s *serverStreamCallBack) receive() { + go func() { + for { + select { + case message, ok := <-s.ch: + if !ok { + fmt.Println("break") + return + } + marshalIndent, _ := json.MarshalIndent(message, "", "\t") + s.responseEntry.SetText(s.responseEntry.Text + string(marshalIndent) + "\n") + } + } + }() + +} + +type clientStreamCallBack struct{} + +func (u clientStreamCallBack) ViewCallBack(message proto.Message, responseEntry *widget.Entry) string { + marshalIndent, _ := json.MarshalIndent(message, "", "\t") + responseEntry.SetText(string(marshalIndent)) + return string(marshalIndent) +} + +type bidiStreamCallBack struct { + ch chan proto.Message + responseEntry *widget.Entry +} + +func (b bidiStreamCallBack) ViewCallBack(message proto.Message) string { + b.ch <- message + return "" +} + +func (b *bidiStreamCallBack) receive() { + go func() { + for { + select { + case message, ok := <-b.ch: + if !ok { + fmt.Println("break") + return + } + marshalIndent, _ := json.MarshalIndent(message, "", "\t") + b.responseEntry.SetText(b.responseEntry.Text + string(marshalIndent) + "\n") + } + } + }() + +} diff --git a/gui/main.go b/gui/main.go index 7259b85..0f83be3 100644 --- a/gui/main.go +++ b/gui/main.go @@ -13,6 +13,7 @@ import ( "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" + "github.com/crossoverJie/ptg/gui/call" "github.com/crossoverJie/ptg/gui/io" "github.com/crossoverJie/ptg/reflect" _ "github.com/crossoverJie/ptg/reflect" @@ -95,7 +96,12 @@ func main() { dialog.ShowError(err, window) return } - json, err := GetParseAdapter(methodInfo[1]).Parse().RequestJSON(service, method) + adapter, err := GetParseAdapter(methodInfo[1]) + if err != nil { + dialog.ShowError(err, window) + return + } + json, err := adapter.Parse().RequestJSON(service, method) if err != nil { dialog.ShowError(err, window) return @@ -116,7 +122,11 @@ func main() { fileOpen.Show() }), widget.NewToolbarAction(theme.ViewRefreshIcon(), func() { - dialog.ShowInformation("Notice", "coming soon", window) + content.Remove(serviceAccordion) + serviceAccordionRemove = true + serviceAccordion.Items = nil + dialog.ShowInformation("Notice", "Reload success.", window) + ReloadReflect(newProto) }), widget.NewToolbarAction(theme.DeleteIcon(), func() { ClearReflect() @@ -134,6 +144,26 @@ func main() { w.SetFixedSize(true) w.Show() }), + //widget.NewToolbarAction(theme.RadioButtonIcon(), func() { + // w := fyne.CurrentApp().NewWindow("Performance test") + // w.Resize(fyne.NewSize(ptgApp.AppWidth, ptgApp.AppHeight)) + // + // myCanvas := w.Canvas() + // //blue := color.NRGBA{R: 0, G: 0, B: 180, A: 255} + // //rect := canvas.NewRectangle(blue) + // //myCanvas.SetContent(rect) + // + // red := color.NRGBA{R: 0xff, G: 0x33, B: 0x33, A: 0xff} + // circle := canvas.NewCircle(color.White) + // circle.StrokeWidth = 4 + // circle.StrokeColor = red + // + // line := canvas.NewLine(red) + // myCanvas.SetContent(line) + // + // w.SetFixedSize(true) + // w.Show() + //}), ) content.Add(toolbar) content.Add(searchAccordion) @@ -179,7 +209,12 @@ func main() { return } index := methodInfo[1] - parse := GetParseAdapter(index).Parse() + adapter, err := GetParseAdapter(index) + if err != nil { + dialog.ShowError(err, window) + return + } + parse := adapter.Parse() mds, err := parse.MethodDescriptor(service, method) if err != nil { dialog.ShowError(err, window) @@ -201,15 +236,25 @@ func main() { } stub := grpcdynamic.NewStub(conn) processBar.Show() - rpc, err := parse.InvokeRpc(ctx, stub, mds, requestEntry.Text) + // call + callBuilder := call.NewCallBuilder().Parse(parse). + ResponseEntry(responseEntry). + RequestEntry(requestEntry). + Mds(mds). + Stub(stub). + RequestEntry(requestEntry). + ProcessBar(processBar). + ErrorHandle(func(window fyne.Window, processBar *widget.ProgressBarInfinite, err error) { + processBar.Hide() + dialog.ShowError(err, window) + }) + response, err := callBuilder.Run(ctx) if err != nil { processBar.Hide() dialog.ShowError(err, window) return } processBar.Hide() - marshalIndent, _ := json.MarshalIndent(rpc, "", "\t") - responseEntry.SetText(string(marshalIndent)) // Write history historyId++ @@ -219,7 +264,7 @@ func main() { Target: targetInput.Text, Request: requestEntry.Text, Metadata: metadataEntry.Text, - Response: string(marshalIndent), + Response: response, }, MethodInfo: reqLabel.Text}, ) diff --git a/gui/reflect.go b/gui/reflect.go index 12bc9b3..95589e2 100644 --- a/gui/reflect.go +++ b/gui/reflect.go @@ -2,7 +2,9 @@ package main import ( "fmt" + "fyne.io/fyne/v2" "github.com/crossoverJie/ptg/reflect" + "github.com/pkg/errors" "sync/atomic" ) @@ -59,14 +61,14 @@ func ClearReflect() { index = 0 } -func ResetReflect() { +func ReloadReflect(f func(uri fyne.URIReadCloser, err error)) { var filenameList []string for k := range parseContainerMap { filenameList = append(filenameList, k) } ClearReflect() for _, filename := range filenameList { - RegisterReflect(filename) + f(&ResetUri{Filename: filename}, nil) } } @@ -78,8 +80,11 @@ func genIndex() string { return fmt.Sprint(atomic.AddInt64(&index, 1)) } -func GetParseAdapter(index string) *ParseReflectAdapter { +func GetParseAdapter(index string) (*ParseReflectAdapter, error) { filename := containerMap[index] - registerReflect, _, _ := RegisterReflect(filename) - return registerReflect + registerReflect, exit, _ := RegisterReflect(filename) + if !exit { + return nil, errors.New("proto not register") + } + return registerReflect, nil } diff --git a/reflect/gen/test.pb.go b/reflect/gen/test.pb.go index d8acdc1..b669fe1 100644 --- a/reflect/gen/test.pb.go +++ b/reflect/gen/test.pb.go @@ -174,7 +174,8 @@ type CloseApiCreate struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OrderId int64 `protobuf:"varint,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"` + OrderId int64 `protobuf:"varint,1,opt,name=order_id,json=orderId,proto3" json:"order_id,omitempty"` + Remark string `protobuf:"bytes,3,opt,name=remark,proto3" json:"remark,omitempty"` } func (x *CloseApiCreate) Reset() { @@ -216,6 +217,13 @@ func (x *CloseApiCreate) GetOrderId() int64 { return 0 } +func (x *CloseApiCreate) GetRemark() string { + if x != nil { + return x.Remark + } + return "" +} + type OrderApiCreate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -355,38 +363,51 @@ var file_reflect_gen_test_proto_rawDesc = []byte{ 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x22, 0x2b, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x41, + 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x22, 0x43, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x49, 0x64, 0x22, 0x79, 0x0a, 0x0e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x70, 0x69, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, - 0x61, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, - 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4c, - 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x28, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x32, 0x7b, 0x0a, 0x0c, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x06, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x1a, 0x0f, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x41, 0x70, 0x69, + 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x22, 0x79, 0x0a, 0x0e, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, + 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x32, 0xb6, 0x02, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, + 0x18, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x05, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, + 0x0f, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x3d, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x12, 0x18, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, + 0x12, 0x3b, 0x0a, 0x08, 0x42, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x70, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x00, 0x32, 0x43, 0x0a, 0x0b, 0x54, 0x65, 0x73, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x41, 0x70, 0x69, 0x1a, 0x11, 0x2e, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x00, 0x42, 0x2c, - 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x72, 0x6f, - 0x73, 0x73, 0x6f, 0x76, 0x65, 0x72, 0x4a, 0x69, 0x65, 0x2f, 0x70, 0x74, 0x67, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x32, 0x43, 0x0a, + 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x08, + 0x54, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x41, 0x70, 0x69, 0x1a, 0x11, 0x2e, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, + 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x6f, 0x76, 0x65, 0x72, 0x4a, 0x69, 0x65, 0x2f, 0x70, 0x74, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -415,12 +436,18 @@ var file_reflect_gen_test_proto_depIdxs = []int32{ 2, // 1: order.v1.Order.reason:type_name -> order.v1.Reason 4, // 2: order.v1.OrderService.Create:input_type -> order.v1.OrderApiCreate 3, // 3: order.v1.OrderService.Close:input_type -> order.v1.CloseApiCreate - 0, // 4: order.v1.TestService.TestList:input_type -> order.v1.ReasonApi - 5, // 5: order.v1.OrderService.Create:output_type -> order.v1.Order - 5, // 6: order.v1.OrderService.Close:output_type -> order.v1.Order - 1, // 7: order.v1.TestService.TestList:output_type -> order.v1.Reasons - 5, // [5:8] is the sub-list for method output_type - 2, // [2:5] is the sub-list for method input_type + 4, // 4: order.v1.OrderService.ServerStream:input_type -> order.v1.OrderApiCreate + 4, // 5: order.v1.OrderService.ClientStream:input_type -> order.v1.OrderApiCreate + 4, // 6: order.v1.OrderService.BdStream:input_type -> order.v1.OrderApiCreate + 0, // 7: order.v1.TestService.TestList:input_type -> order.v1.ReasonApi + 5, // 8: order.v1.OrderService.Create:output_type -> order.v1.Order + 5, // 9: order.v1.OrderService.Close:output_type -> order.v1.Order + 5, // 10: order.v1.OrderService.ServerStream:output_type -> order.v1.Order + 5, // 11: order.v1.OrderService.ClientStream:output_type -> order.v1.Order + 5, // 12: order.v1.OrderService.BdStream:output_type -> order.v1.Order + 1, // 13: order.v1.TestService.TestList:output_type -> order.v1.Reasons + 8, // [8:14] is the sub-list for method output_type + 2, // [2:8] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name diff --git a/reflect/gen/test.proto b/reflect/gen/test.proto index 7bf60cb..bd146f7 100644 --- a/reflect/gen/test.proto +++ b/reflect/gen/test.proto @@ -10,6 +10,11 @@ service OrderService{ rpc Close(CloseApiCreate) returns (Order) {} + rpc ServerStream(OrderApiCreate) returns (stream Order) {} + + rpc ClientStream(stream OrderApiCreate) returns (Order) {} + + rpc BdStream(stream OrderApiCreate) returns (stream Order) {} } service TestService{ @@ -32,6 +37,7 @@ message Reason{ message CloseApiCreate{ int64 order_id = 1; + string remark = 3; } diff --git a/reflect/gen/test_grpc.pb.go b/reflect/gen/test_grpc.pb.go index 4b025d3..9cb2188 100644 --- a/reflect/gen/test_grpc.pb.go +++ b/reflect/gen/test_grpc.pb.go @@ -20,6 +20,9 @@ const _ = grpc.SupportPackageIsVersion7 type OrderServiceClient interface { Create(ctx context.Context, in *OrderApiCreate, opts ...grpc.CallOption) (*Order, error) Close(ctx context.Context, in *CloseApiCreate, opts ...grpc.CallOption) (*Order, error) + ServerStream(ctx context.Context, in *OrderApiCreate, opts ...grpc.CallOption) (OrderService_ServerStreamClient, error) + ClientStream(ctx context.Context, opts ...grpc.CallOption) (OrderService_ClientStreamClient, error) + BdStream(ctx context.Context, opts ...grpc.CallOption) (OrderService_BdStreamClient, error) } type orderServiceClient struct { @@ -48,12 +51,112 @@ func (c *orderServiceClient) Close(ctx context.Context, in *CloseApiCreate, opts return out, nil } +func (c *orderServiceClient) ServerStream(ctx context.Context, in *OrderApiCreate, opts ...grpc.CallOption) (OrderService_ServerStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &OrderService_ServiceDesc.Streams[0], "/order.v1.OrderService/ServerStream", opts...) + if err != nil { + return nil, err + } + x := &orderServiceServerStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type OrderService_ServerStreamClient interface { + Recv() (*Order, error) + grpc.ClientStream +} + +type orderServiceServerStreamClient struct { + grpc.ClientStream +} + +func (x *orderServiceServerStreamClient) Recv() (*Order, error) { + m := new(Order) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *orderServiceClient) ClientStream(ctx context.Context, opts ...grpc.CallOption) (OrderService_ClientStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &OrderService_ServiceDesc.Streams[1], "/order.v1.OrderService/ClientStream", opts...) + if err != nil { + return nil, err + } + x := &orderServiceClientStreamClient{stream} + return x, nil +} + +type OrderService_ClientStreamClient interface { + Send(*OrderApiCreate) error + CloseAndRecv() (*Order, error) + grpc.ClientStream +} + +type orderServiceClientStreamClient struct { + grpc.ClientStream +} + +func (x *orderServiceClientStreamClient) Send(m *OrderApiCreate) error { + return x.ClientStream.SendMsg(m) +} + +func (x *orderServiceClientStreamClient) CloseAndRecv() (*Order, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(Order) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *orderServiceClient) BdStream(ctx context.Context, opts ...grpc.CallOption) (OrderService_BdStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &OrderService_ServiceDesc.Streams[2], "/order.v1.OrderService/BdStream", opts...) + if err != nil { + return nil, err + } + x := &orderServiceBdStreamClient{stream} + return x, nil +} + +type OrderService_BdStreamClient interface { + Send(*OrderApiCreate) error + Recv() (*Order, error) + grpc.ClientStream +} + +type orderServiceBdStreamClient struct { + grpc.ClientStream +} + +func (x *orderServiceBdStreamClient) Send(m *OrderApiCreate) error { + return x.ClientStream.SendMsg(m) +} + +func (x *orderServiceBdStreamClient) Recv() (*Order, error) { + m := new(Order) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // OrderServiceServer is the server API for OrderService service. // All implementations must embed UnimplementedOrderServiceServer // for forward compatibility type OrderServiceServer interface { Create(context.Context, *OrderApiCreate) (*Order, error) Close(context.Context, *CloseApiCreate) (*Order, error) + ServerStream(*OrderApiCreate, OrderService_ServerStreamServer) error + ClientStream(OrderService_ClientStreamServer) error + BdStream(OrderService_BdStreamServer) error mustEmbedUnimplementedOrderServiceServer() } @@ -67,6 +170,15 @@ func (UnimplementedOrderServiceServer) Create(context.Context, *OrderApiCreate) func (UnimplementedOrderServiceServer) Close(context.Context, *CloseApiCreate) (*Order, error) { return nil, status.Errorf(codes.Unimplemented, "method Close not implemented") } +func (UnimplementedOrderServiceServer) ServerStream(*OrderApiCreate, OrderService_ServerStreamServer) error { + return status.Errorf(codes.Unimplemented, "method ServerStream not implemented") +} +func (UnimplementedOrderServiceServer) ClientStream(OrderService_ClientStreamServer) error { + return status.Errorf(codes.Unimplemented, "method ClientStream not implemented") +} +func (UnimplementedOrderServiceServer) BdStream(OrderService_BdStreamServer) error { + return status.Errorf(codes.Unimplemented, "method BdStream not implemented") +} func (UnimplementedOrderServiceServer) mustEmbedUnimplementedOrderServiceServer() {} // UnsafeOrderServiceServer may be embedded to opt out of forward compatibility for this service. @@ -116,6 +228,79 @@ func _OrderService_Close_Handler(srv interface{}, ctx context.Context, dec func( return interceptor(ctx, in, info, handler) } +func _OrderService_ServerStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(OrderApiCreate) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OrderServiceServer).ServerStream(m, &orderServiceServerStreamServer{stream}) +} + +type OrderService_ServerStreamServer interface { + Send(*Order) error + grpc.ServerStream +} + +type orderServiceServerStreamServer struct { + grpc.ServerStream +} + +func (x *orderServiceServerStreamServer) Send(m *Order) error { + return x.ServerStream.SendMsg(m) +} + +func _OrderService_ClientStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(OrderServiceServer).ClientStream(&orderServiceClientStreamServer{stream}) +} + +type OrderService_ClientStreamServer interface { + SendAndClose(*Order) error + Recv() (*OrderApiCreate, error) + grpc.ServerStream +} + +type orderServiceClientStreamServer struct { + grpc.ServerStream +} + +func (x *orderServiceClientStreamServer) SendAndClose(m *Order) error { + return x.ServerStream.SendMsg(m) +} + +func (x *orderServiceClientStreamServer) Recv() (*OrderApiCreate, error) { + m := new(OrderApiCreate) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _OrderService_BdStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(OrderServiceServer).BdStream(&orderServiceBdStreamServer{stream}) +} + +type OrderService_BdStreamServer interface { + Send(*Order) error + Recv() (*OrderApiCreate, error) + grpc.ServerStream +} + +type orderServiceBdStreamServer struct { + grpc.ServerStream +} + +func (x *orderServiceBdStreamServer) Send(m *Order) error { + return x.ServerStream.SendMsg(m) +} + +func (x *orderServiceBdStreamServer) Recv() (*OrderApiCreate, error) { + m := new(OrderApiCreate) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // OrderService_ServiceDesc is the grpc.ServiceDesc for OrderService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -132,7 +317,24 @@ var OrderService_ServiceDesc = grpc.ServiceDesc{ Handler: _OrderService_Close_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "ServerStream", + Handler: _OrderService_ServerStream_Handler, + ServerStreams: true, + }, + { + StreamName: "ClientStream", + Handler: _OrderService_ClientStream_Handler, + ClientStreams: true, + }, + { + StreamName: "BdStream", + Handler: _OrderService_BdStream_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, Metadata: "reflect/gen/test.proto", } diff --git a/reflect/reflect.go b/reflect/reflect.go index f34413c..deaf3d6 100644 --- a/reflect/reflect.go +++ b/reflect/reflect.go @@ -83,11 +83,31 @@ func (p *ParseReflect) MethodDescriptor(serviceName, methodName string) (*desc.M // make unary RPC func (p *ParseReflect) InvokeRpc(ctx context.Context, stub grpcdynamic.Stub, mds *desc.MethodDescriptor, data string, opts ...grpc.CallOption) (proto.Message, error) { - messages, err := createPayloadsFromJSON(mds, data) + messages, err := CreatePayloadsFromJSON(mds, data) if err != nil { return nil, err } - return stub.InvokeRpc(ctx, mds, messages[0]) + return stub.InvokeRpc(ctx, mds, messages[0], opts...) +} + +// make unary server stream RPC +func (p *ParseReflect) InvokeServerStreamRpc(ctx context.Context, stub grpcdynamic.Stub, mds *desc.MethodDescriptor, data string, opts ...grpc.CallOption) (*grpcdynamic.ServerStream, error) { + + messages, err := CreatePayloadsFromJSON(mds, data) + if err != nil { + return nil, err + } + return stub.InvokeRpcServerStream(ctx, mds, messages[0], opts...) +} + +// make unary client stream RPC +func (p *ParseReflect) InvokeClientStreamRpc(ctx context.Context, stub grpcdynamic.Stub, mds *desc.MethodDescriptor, opts ...grpc.CallOption) (*grpcdynamic.ClientStream, error) { + return stub.InvokeRpcClientStream(ctx, mds, opts...) +} + +// make unary bidi stream RPC +func (p *ParseReflect) InvokeBidiStreamRpc(ctx context.Context, stub grpcdynamic.Stub, mds *desc.MethodDescriptor, opts ...grpc.CallOption) (*grpcdynamic.BidiStream, error) { + return stub.InvokeRpcBidiStream(ctx, mds, opts...) } func convertMessageToMap(message *desc.MessageDescriptor) map[string]interface{} { @@ -134,7 +154,7 @@ func ParseServiceMethod(svcAndMethod string) (string, string, error) { } } -func createPayloadsFromJSON(mds *desc.MethodDescriptor, data string) ([]*dynamic.Message, error) { +func CreatePayloadsFromJSON(mds *desc.MethodDescriptor, data string) ([]*dynamic.Message, error) { md := mds.GetInputType() var inputs []*dynamic.Message diff --git a/reflect/reflect_test.go b/reflect/reflect_test.go index a7734f6..db562db 100644 --- a/reflect/reflect_test.go +++ b/reflect/reflect_test.go @@ -6,11 +6,13 @@ import ( "fmt" v1 "github.com/crossoverJie/ptg/reflect/gen" "github.com/crossoverJie/ptg/reflect/gen/user" + "github.com/golang/protobuf/proto" "github.com/jhump/protoreflect/dynamic/grpcdynamic" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + "io" "log" "net" "strings" @@ -79,6 +81,130 @@ func TestParseReflect_InvokeRpc(t *testing.T) { marshalIndent, _ := json.MarshalIndent(rpc, "", "\t") fmt.Println(string(marshalIndent)) } +func TestParseReflect_InvokeServerStreamRpc(t *testing.T) { + data := `{"order_id":20,"user_id":[20],"remark":"Hello","reason_id":[10]}` + metaStr := `{"lang":"zh"}` + var m map[string]string + err := json.Unmarshal([]byte(metaStr), &m) + if err != nil { + panic(err) + } + filename := "gen/test.proto" + parse, err := NewParse(filename) + if err != nil { + panic(err) + } + + mds, err := parse.MethodDescriptor("order.v1.OrderService", "ServerStream") + if err != nil { + panic(err) + } + var opts []grpc.DialOption + opts = append(opts, grpc.WithInsecure()) + conn, err := grpc.DialContext(context.Background(), "127.0.0.1:6001", opts...) + stub := grpcdynamic.NewStub(conn) + + md := metadata.New(m) + ctx := metadata.NewOutgoingContext(context.Background(), md) + rpc, err := parse.InvokeServerStreamRpc(ctx, stub, mds, data) + if err != nil { + panic(err) + } + var msgs []proto.Message + for { + msg, err := rpc.RecvMsg() + if err == io.EOF { + marshalIndent, _ := json.MarshalIndent(msgs, "", "\t") + fmt.Println(string(marshalIndent)) + return + } + if err != nil { + panic(err) + } + msgs = append(msgs, msg) + } + fmt.Println("=========") + +} +func TestParseReflect_InvokeClientStreamRpc(t *testing.T) { + data := `{"order_id":20,"user_id":[20],"remark":"Hello","reason_id":[10]}` + metaStr := `{"lang":"zh"}` + var m map[string]string + err := json.Unmarshal([]byte(metaStr), &m) + if err != nil { + panic(err) + } + filename := "gen/test.proto" + parse, err := NewParse(filename) + if err != nil { + panic(err) + } + + mds, err := parse.MethodDescriptor("order.v1.OrderService", "ClientStream") + if err != nil { + panic(err) + } + var opts []grpc.DialOption + opts = append(opts, grpc.WithInsecure()) + conn, err := grpc.DialContext(context.Background(), "127.0.0.1:6001", opts...) + stub := grpcdynamic.NewStub(conn) + + md := metadata.New(m) + ctx := metadata.NewOutgoingContext(context.Background(), md) + rpc, err := parse.InvokeClientStreamRpc(ctx, stub, mds) + for i := 0; i < 5; i++ { + if err != nil { + panic(err) + } + time.Sleep(1 * time.Second) + messages, _ := CreatePayloadsFromJSON(mds, data) + rpc.SendMsg(messages[0]) + } + receive, err := rpc.CloseAndReceive() + marshalIndent, _ := json.MarshalIndent(receive, "", "\t") + fmt.Println(string(marshalIndent)) +} +func TestParseReflect_InvokeBidiStreamRpc(t *testing.T) { + data := `{"order_id":20,"user_id":[20],"remark":"Hello","reason_id":[10]}` + metaStr := `{"lang":"zh"}` + var m map[string]string + err := json.Unmarshal([]byte(metaStr), &m) + if err != nil { + panic(err) + } + filename := "gen/test.proto" + parse, err := NewParse(filename) + if err != nil { + panic(err) + } + + mds, err := parse.MethodDescriptor("order.v1.OrderService", "BdStream") + if err != nil { + panic(err) + } + var opts []grpc.DialOption + opts = append(opts, grpc.WithInsecure()) + conn, err := grpc.DialContext(context.Background(), "127.0.0.1:6001", opts...) + stub := grpcdynamic.NewStub(conn) + + md := metadata.New(m) + ctx := metadata.NewOutgoingContext(context.Background(), md) + rpc, err := parse.InvokeBidiStreamRpc(ctx, stub, mds) + for i := 0; i < 5; i++ { + if err != nil { + panic(err) + } + time.Sleep(1 * time.Second) + messages, _ := CreatePayloadsFromJSON(mds, data) + rpc.SendMsg(messages[0]) + + receive, _ := rpc.RecvMsg() + marshalIndent, _ := json.MarshalIndent(receive, "", "\t") + fmt.Println(string(marshalIndent)) + } + rpc.CloseSend() + +} func TestServer(t *testing.T) { port := 6001 @@ -116,7 +242,8 @@ func (o *Order) Create(ctx context.Context, in *v1.OrderApiCreate) (*v1.Order, e }, nil } -func (o *Order) Close(context.Context, *v1.CloseApiCreate) (*v1.Order, error) { +func (o *Order) Close(ctx context.Context, req *v1.CloseApiCreate) (*v1.Order, error) { + log.Println(req) time.Sleep(200 * time.Millisecond) return &v1.Order{ OrderId: 1000, @@ -124,6 +251,61 @@ func (o *Order) Close(context.Context, *v1.CloseApiCreate) (*v1.Order, error) { }, nil } +func (o *Order) ServerStream(in *v1.OrderApiCreate, rs v1.OrderService_ServerStreamServer) error { + for i := 0; i < 5; i++ { + time.Sleep(1 * time.Second) + rs.Send(&v1.Order{ + OrderId: in.OrderId, + Reason: nil, + }) + } + return nil +} + +func (o *Order) ClientStream(rs v1.OrderService_ClientStreamServer) error { + var value []int64 + for { + recv, err := rs.Recv() + if err == io.EOF { + rs.SendAndClose(&v1.Order{ + OrderId: 100, + Reason: nil, + }) + log.Println(value) + return nil + } + if err != nil { + return err + } + value = append(value, recv.OrderId) + log.Printf("ClientStream receiv msg %v", recv.OrderId) + } + log.Println("ClientStream finish") + + return nil +} +func (o *Order) BdStream(rs v1.OrderService_BdStreamServer) error { + var value []int64 + for { + recv, err := rs.Recv() + if err == io.EOF { + log.Println(value) + return nil + } + if err != nil { + panic(err) + } + value = append(value, recv.OrderId) + log.Printf("BdStream receiv msg %v", recv.OrderId) + rs.SendMsg(&v1.Order{ + OrderId: recv.OrderId, + Reason: nil, + }) + } + + return nil +} + func TestParseServiceMethod(t *testing.T) { s, m, err := ParseServiceMethod("order.v1.OrderService.Create") fmt.Println(s, m, err)