* WIP on auto-generating CLi * WIP * WIP * WIP * add pagination.go * handle more flag types * WIP on refactoring * WIP * working tests * add docs * echo all flags * add repeated tests * remove comment * fix compositeListValue issue Co-authored-by: Anil Kumar Kammari <anil@vitwit.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
package flag
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/spf13/pflag"
|
|
"google.golang.org/protobuf/encoding/protojson"
|
|
"google.golang.org/protobuf/proto"
|
|
"google.golang.org/protobuf/reflect/protoreflect"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client/v2/internal/util"
|
|
)
|
|
|
|
type jsonMessageFlagType struct {
|
|
messageDesc protoreflect.MessageDescriptor
|
|
}
|
|
|
|
func (j jsonMessageFlagType) NewValue(_ context.Context, builder *Builder) pflag.Value {
|
|
return &jsonMessageFlagValue{
|
|
messageType: util.ResolveMessageType(builder.TypeResolver, j.messageDesc),
|
|
jsonMarshalOptions: protojson.MarshalOptions{Resolver: builder.TypeResolver},
|
|
jsonUnmarshalOptions: protojson.UnmarshalOptions{Resolver: builder.TypeResolver},
|
|
}
|
|
}
|
|
|
|
func (j jsonMessageFlagType) DefaultValue() string {
|
|
return ""
|
|
}
|
|
|
|
type jsonMessageFlagValue struct {
|
|
jsonMarshalOptions protojson.MarshalOptions
|
|
jsonUnmarshalOptions protojson.UnmarshalOptions
|
|
messageType protoreflect.MessageType
|
|
message proto.Message
|
|
}
|
|
|
|
func (j jsonMessageFlagValue) Get() protoreflect.Value {
|
|
if j.message == nil {
|
|
return protoreflect.Value{}
|
|
}
|
|
return protoreflect.ValueOfMessage(j.message.ProtoReflect())
|
|
}
|
|
|
|
func (j jsonMessageFlagValue) String() string {
|
|
if j.message == nil {
|
|
return ""
|
|
}
|
|
|
|
bz, err := j.jsonMarshalOptions.Marshal(j.message)
|
|
if err != nil {
|
|
return err.Error()
|
|
}
|
|
return string(bz)
|
|
}
|
|
|
|
func (j *jsonMessageFlagValue) Set(s string) error {
|
|
j.message = j.messageType.New().Interface()
|
|
return j.jsonUnmarshalOptions.Unmarshal([]byte(s), j.message)
|
|
}
|
|
|
|
func (j jsonMessageFlagValue) Type() string {
|
|
return fmt.Sprintf("%s (json)", j.messageType.Descriptor().FullName())
|
|
}
|