From 95ddd2a313e169729da3aa238c50e4e25213ff7d Mon Sep 17 00:00:00 2001 From: Shelikhoo Date: Sat, 19 Jun 2021 22:43:31 +0100 Subject: [PATCH] jsonpb loading --- infra/conf/v2jsonpb/any2.go | 133 +++++++++++++++++++++--- infra/conf/v2jsonpb/errors.generated.go | 9 ++ 2 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 infra/conf/v2jsonpb/errors.generated.go diff --git a/infra/conf/v2jsonpb/any2.go b/infra/conf/v2jsonpb/any2.go index c61245f1f..f044c1364 100644 --- a/infra/conf/v2jsonpb/any2.go +++ b/infra/conf/v2jsonpb/any2.go @@ -42,6 +42,39 @@ func (v V2JsonProtobufAnyTypeDescriptor) FullName() protoreflect.FullName { } func (v V2JsonProtobufAnyTypeDescriptor) Fields() protoreflect.FieldDescriptors { + return V2JsonProtobufAnyTypeFields{v.MessageDescriptor.Fields()} +} + +type V2JsonProtobufAnyTypeFields struct { + protoreflect.FieldDescriptors +} + +func (v V2JsonProtobufAnyTypeFields) Len() int { + panic("implement me") +} + +func (v V2JsonProtobufAnyTypeFields) Get(i int) protoreflect.FieldDescriptor { + panic("implement me") +} + +func (v V2JsonProtobufAnyTypeFields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor { + panic("implement me") +} + +func (v V2JsonProtobufAnyTypeFields) ByJSONName(s string) protoreflect.FieldDescriptor { + switch s { + case "type": + return &V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByName("type_url")} + default: + return &V2JsonProtobufAnyValueField{v.FieldDescriptors.ByName("value"), "value"} + } +} + +func (v V2JsonProtobufAnyTypeFields) ByTextName(s string) protoreflect.FieldDescriptor { + panic("implement me") +} + +func (v V2JsonProtobufAnyTypeFields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor { panic("implement me") } @@ -123,7 +156,7 @@ func (v V2JsonProtobufListFollower) Set(i int, value protoreflect.Value) { } func (v V2JsonProtobufListFollower) Append(value protoreflect.Value) { - panic("implement me") + v.List.Append(value) } func (v V2JsonProtobufListFollower) AppendMutable() protoreflect.Value { @@ -135,7 +168,8 @@ func (v V2JsonProtobufListFollower) Truncate(i int) { } func (v V2JsonProtobufListFollower) NewElement() protoreflect.Value { - panic("implement me") + newelement := v.List.NewElement() + return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{newelement.Message()}) } func (v V2JsonProtobufListFollower) IsValid() bool { @@ -158,7 +192,7 @@ func (v V2JsonProtobufMapFollower) Range(f func(protoreflect.MapKey, protoreflec } func (v V2JsonProtobufMapFollower) Has(key protoreflect.MapKey) bool { - panic("implement me") + return v.Map.Has(key) } func (v V2JsonProtobufMapFollower) Clear(key protoreflect.MapKey) { @@ -170,7 +204,7 @@ func (v V2JsonProtobufMapFollower) Get(key protoreflect.MapKey) protoreflect.Val } func (v V2JsonProtobufMapFollower) Set(key protoreflect.MapKey, value protoreflect.Value) { - panic("implement me") + v.Map.Set(key, value) } func (v V2JsonProtobufMapFollower) Mutable(key protoreflect.MapKey) protoreflect.Value { @@ -178,7 +212,8 @@ func (v V2JsonProtobufMapFollower) Mutable(key protoreflect.MapKey) protoreflect } func (v V2JsonProtobufMapFollower) NewValue() protoreflect.Value { - panic("implement me") + newelement := v.Map.NewValue() + return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{newelement.Message()}) } func (v V2JsonProtobufMapFollower) IsValid() bool { @@ -194,7 +229,7 @@ func (v *V2JsonProtobufFollower) New() protoreflect.Message { } func (v *V2JsonProtobufFollower) Interface() protoreflect.ProtoMessage { - panic("implement me") + return v.Message.Interface() } func (v *V2JsonProtobufFollower) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { @@ -273,19 +308,71 @@ func (v *V2JsonProtobufFollower) Has(descriptor protoreflect.FieldDescriptor) bo } func (v *V2JsonProtobufFollower) Clear(descriptor protoreflect.FieldDescriptor) { - panic("implement me") + v.Message.Clear(descriptor) } func (v *V2JsonProtobufFollower) Set(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) { - panic("implement me") + switch descriptor.(type) { + case V2JsonProtobufFollowerFieldDescriptor: + v.Message.Set(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor, value) + case *V2JsonProtobufFollowerFieldDescriptor: + v.Message.Set(descriptor.(*V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor, value) + case *V2JsonProtobufAnyValueField: + protodata := value.Message() + bytesw, err := proto.MarshalOptions{AllowPartial: true}.Marshal(&V2JsonProtobufAnyValueFieldReturn{protodata}) + if err != nil { + panic(err) + } + v.Message.Set(descriptor.(*V2JsonProtobufAnyValueField).FieldDescriptor, protoreflect.ValueOfBytes(bytesw)) + default: + v.Message.Set(descriptor, value) + } + +} + +type V2JsonProtobufAnyValueFieldReturn struct { + protoreflect.Message +} + +func (v *V2JsonProtobufAnyValueFieldReturn) ProtoReflect() protoreflect.Message { + if bufFollow, ok := v.Message.(*V2JsonProtobufFollower); ok { + return bufFollow.Message + } + return v.Message } func (v *V2JsonProtobufFollower) Mutable(descriptor protoreflect.FieldDescriptor) protoreflect.Value { - panic("implement me") + value := v.Message.Mutable(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor) + if descriptor.IsList() { + return protoreflect.ValueOfList(&V2JsonProtobufListFollower{value.List()}) + } + if descriptor.IsMap() { + return protoreflect.ValueOfMap(&V2JsonProtobufMapFollower{value.Map(), descriptor}) + } + if descriptor.Kind() == protoreflect.MessageKind { + return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()}) + } + return value } func (v *V2JsonProtobufFollower) NewField(descriptor protoreflect.FieldDescriptor) protoreflect.Value { - panic("implement me") + + if _, ok := descriptor.(*V2JsonProtobufAnyValueField); ok { + + url := v.Message.Get(v.Message.Descriptor().Fields().ByName("type_url")).String() + + v2type := serial.V2TypeFromURL(url) + instance, err := serial.GetInstance(v2type) + if err != nil { + panic(err) + } + newvalue := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{instance.(proto.Message).ProtoReflect()}) + return newvalue + } + + value := v.Message.NewField(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor) + newvalue := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()}) + return newvalue } func (v *V2JsonProtobufFollower) WhichOneof(descriptor protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { @@ -297,11 +384,11 @@ func (v *V2JsonProtobufFollower) GetUnknown() protoreflect.RawFields { } func (v *V2JsonProtobufFollower) SetUnknown(fields protoreflect.RawFields) { - panic("implement me") + v.Message.SetUnknown(fields) } func (v *V2JsonProtobufFollower) IsValid() bool { - panic("implement me") + return v.Message.IsValid() } func (v *V2JsonProtobufFollower) ProtoReflect() protoreflect.Message { @@ -315,9 +402,29 @@ func (v *V2JsonProtobufFollower) Descriptor() protoreflect.MessageDescriptor { desc := &V2JsonProtobufAnyTypeDescriptor{(&anypb.Any{}).ProtoReflect().Descriptor()} return desc } - return v.Message.Descriptor() + return &V2JsonProtobufFollowerDescriptor{v.Message.Descriptor()} } func (v *V2JsonProtobufFollower) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { panic("implement me") } + +type V2JsonProtobufFollowerDescriptor struct { + protoreflect.MessageDescriptor +} + +func (v *V2JsonProtobufFollowerDescriptor) Fields() protoreflect.FieldDescriptors { + return &V2JsonProtobufFollowerFields{v.MessageDescriptor.Fields()} +} + +type V2JsonProtobufFollowerFields struct { + protoreflect.FieldDescriptors +} + +func (v *V2JsonProtobufFollowerFields) ByJSONName(s string) protoreflect.FieldDescriptor { + return V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByJSONName(s)} +} + +func (v *V2JsonProtobufFollowerFields) ByTextName(s string) protoreflect.FieldDescriptor { + return V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByTextName(s)} +} diff --git a/infra/conf/v2jsonpb/errors.generated.go b/infra/conf/v2jsonpb/errors.generated.go new file mode 100644 index 000000000..c92632f0d --- /dev/null +++ b/infra/conf/v2jsonpb/errors.generated.go @@ -0,0 +1,9 @@ +package v2jsonpb + +import "github.com/v2fly/v2ray-core/v4/common/errors" + +type errPathObjHolder struct{} + +func newError(values ...interface{}) *errors.Error { + return errors.New(values...).WithPathObj(errPathObjHolder{}) +}