make jsonpb marshaler emit defaults (#3)
add `-emit-defaults` flag so that output will include default values (e.g. "false" for boolean flags)
This commit is contained in:
parent
cf5e463f0a
commit
7d304729b4
|
|
@ -12,6 +12,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/golang/protobuf/jsonpb"
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/grpcreflect"
|
"github.com/jhump/protoreflect/grpcreflect"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
@ -64,6 +66,8 @@ var (
|
||||||
`The maximum total time the operation can take. This is useful for
|
`The maximum total time the operation can take. This is useful for
|
||||||
preventing batch jobs that use grpcurl from hanging due to slow or bad
|
preventing batch jobs that use grpcurl from hanging due to slow or bad
|
||||||
network links or due to incorrect stream method usage.`)
|
network links or due to incorrect stream method usage.`)
|
||||||
|
emitDefaults = flag.Bool("emit-defaults", false,
|
||||||
|
`Emit default values from JSON-encoded responses.`)
|
||||||
verbose = flag.Bool("v", false,
|
verbose = flag.Bool("v", false,
|
||||||
`Enable verbose output.`)
|
`Enable verbose output.`)
|
||||||
)
|
)
|
||||||
|
|
@ -442,12 +446,17 @@ func (*handler) OnReceiveHeaders(md metadata.MD) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) OnReceiveResponse(rsp json.RawMessage) {
|
func (h *handler) OnReceiveResponse(resp proto.Message) {
|
||||||
h.respCount++
|
h.respCount++
|
||||||
if *verbose {
|
if *verbose {
|
||||||
fmt.Print("\nResponse contents:\n")
|
fmt.Print("\nResponse contents:\n")
|
||||||
}
|
}
|
||||||
fmt.Println(string(rsp))
|
jsm := jsonpb.Marshaler{EmitDefaults: *emitDefaults, Indent: " "}
|
||||||
|
respStr, err := jsm.MarshalToString(resp)
|
||||||
|
if err != nil {
|
||||||
|
fail(err, "failed to generate JSON form of response message")
|
||||||
|
}
|
||||||
|
fmt.Println(respStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) OnReceiveTrailers(stat *status.Status, md metadata.MD) {
|
func (h *handler) OnReceiveTrailers(stat *status.Status, md metadata.MD) {
|
||||||
|
|
|
||||||
33
grpcurl.go
33
grpcurl.go
|
|
@ -263,7 +263,7 @@ type InvocationEventHandler interface {
|
||||||
// OnReceiveHeaders is called when response headers have been received.
|
// OnReceiveHeaders is called when response headers have been received.
|
||||||
OnReceiveHeaders(metadata.MD)
|
OnReceiveHeaders(metadata.MD)
|
||||||
// OnReceiveResponse is called for each response message received.
|
// OnReceiveResponse is called for each response message received.
|
||||||
OnReceiveResponse(json.RawMessage)
|
OnReceiveResponse(proto.Message)
|
||||||
// OnReceiveTrailers is called when response trailers and final RPC status have been received.
|
// OnReceiveTrailers is called when response trailers and final RPC status have been received.
|
||||||
OnReceiveTrailers(*status.Status, metadata.MD)
|
OnReceiveTrailers(*status.Status, metadata.MD)
|
||||||
}
|
}
|
||||||
|
|
@ -384,14 +384,8 @@ func invokeUnary(ctx context.Context, stub grpcdynamic.Stub, md *desc.MethodDesc
|
||||||
|
|
||||||
handler.OnReceiveHeaders(respHeaders)
|
handler.OnReceiveHeaders(respHeaders)
|
||||||
|
|
||||||
var respStr string
|
|
||||||
if stat.Code() == codes.OK {
|
if stat.Code() == codes.OK {
|
||||||
jsm := jsonpb.Marshaler{Indent: " "}
|
handler.OnReceiveResponse(resp)
|
||||||
respStr, err = jsm.MarshalToString(resp)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to generate JSON form of response message: %v", err)
|
|
||||||
}
|
|
||||||
handler.OnReceiveResponse(json.RawMessage(respStr))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.OnReceiveTrailers(stat, respTrailers)
|
handler.OnReceiveTrailers(stat, respTrailers)
|
||||||
|
|
@ -447,14 +441,8 @@ func invokeClientStream(ctx context.Context, stub grpcdynamic.Stub, md *desc.Met
|
||||||
handler.OnReceiveHeaders(respHeaders)
|
handler.OnReceiveHeaders(respHeaders)
|
||||||
}
|
}
|
||||||
|
|
||||||
var respStr string
|
|
||||||
if stat.Code() == codes.OK {
|
if stat.Code() == codes.OK {
|
||||||
jsm := jsonpb.Marshaler{Indent: " "}
|
handler.OnReceiveResponse(resp)
|
||||||
respStr, err = jsm.MarshalToString(resp)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to generate JSON form of response message: %v", err)
|
|
||||||
}
|
|
||||||
handler.OnReceiveResponse(json.RawMessage(respStr))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
handler.OnReceiveTrailers(stat, str.Trailer())
|
handler.OnReceiveTrailers(stat, str.Trailer())
|
||||||
|
|
@ -502,12 +490,7 @@ func invokeServerStream(ctx context.Context, stub grpcdynamic.Stub, md *desc.Met
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
jsm := jsonpb.Marshaler{Indent: " "}
|
handler.OnReceiveResponse(resp)
|
||||||
respStr, err := jsm.MarshalToString(resp)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to generate JSON form of response message: %v", err)
|
|
||||||
}
|
|
||||||
handler.OnReceiveResponse(json.RawMessage(respStr))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stat, ok := status.FromError(err)
|
stat, ok := status.FromError(err)
|
||||||
|
|
@ -588,13 +571,7 @@ func invokeBidi(ctx context.Context, cancel context.CancelFunc, stub grpcdynamic
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
jsm := jsonpb.Marshaler{Indent: " "}
|
handler.OnReceiveResponse(resp)
|
||||||
respStr, err := jsm.MarshalToString(resp)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to generate JSON form of response message: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
handler.OnReceiveResponse(json.RawMessage(respStr))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if se, ok := sendErr.Load().(error); ok && se != io.EOF {
|
if se, ok := sendErr.Load().(error); ok && se != io.EOF {
|
||||||
|
|
|
||||||
|
|
@ -576,8 +576,13 @@ func (h *handler) OnReceiveHeaders(md metadata.MD) {
|
||||||
h.respHeaders = md
|
h.respHeaders = md
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) OnReceiveResponse(msg json.RawMessage) {
|
func (h *handler) OnReceiveResponse(msg proto.Message) {
|
||||||
h.respMessages = append(h.respMessages, string(msg))
|
jsm := jsonpb.Marshaler{Indent: " "}
|
||||||
|
respStr, err := jsm.MarshalToString(msg)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to generate JSON form of response message: %v", err))
|
||||||
|
}
|
||||||
|
h.respMessages = append(h.respMessages, respStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *handler) OnReceiveTrailers(stat *status.Status, md metadata.MD) {
|
func (h *handler) OnReceiveTrailers(stat *status.Status, md metadata.MD) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue