follower.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package v2jsonpb
  2. import (
  3. "google.golang.org/protobuf/proto"
  4. "google.golang.org/protobuf/reflect/protoreflect"
  5. "google.golang.org/protobuf/types/known/anypb"
  6. "github.com/v2fly/v2ray-core/v4/common/serial"
  7. )
  8. type V2JsonProtobufFollowerFieldDescriptor struct {
  9. protoreflect.FieldDescriptor
  10. }
  11. type V2JsonProtobufFollower struct {
  12. protoreflect.Message
  13. }
  14. func (v *V2JsonProtobufFollower) Type() protoreflect.MessageType {
  15. panic("implement me")
  16. }
  17. func (v *V2JsonProtobufFollower) New() protoreflect.Message {
  18. panic("implement me")
  19. }
  20. func (v *V2JsonProtobufFollower) Interface() protoreflect.ProtoMessage {
  21. return v.Message.Interface()
  22. }
  23. func (v *V2JsonProtobufFollower) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
  24. v.Message.Range(func(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) bool {
  25. name := descriptor.FullName()
  26. fullname := v.Message.Descriptor().FullName()
  27. if fullname == "google.protobuf.Any" {
  28. switch name {
  29. case "google.protobuf.Any.type_url":
  30. fd := V2JsonProtobufAnyTypeFieldDescriptor{descriptor}
  31. return f(fd, value)
  32. case "google.protobuf.Any.value":
  33. url := v.Message.Get(v.Message.Descriptor().Fields().ByName("type_url")).String()
  34. fd := &V2JsonProtobufAnyValueField{descriptor, url}
  35. bytesout := v.Message.Get(v.Message.Descriptor().Fields().Get(1)).Bytes()
  36. v2type := serial.V2TypeFromURL(url)
  37. instance, err := serial.GetInstance(v2type)
  38. if err != nil {
  39. panic(err)
  40. }
  41. unmarshaler := proto.UnmarshalOptions{AllowPartial: true, Resolver: anyresolverv2{backgroundResolver: serial.GetResolver()}}
  42. err = unmarshaler.Unmarshal(bytesout, instance.(proto.Message))
  43. if err != nil {
  44. panic(err)
  45. }
  46. return f(fd, protoreflect.ValueOfMessage(&V2JsonProtobufFollower{instance.(proto.Message).ProtoReflect()}))
  47. default:
  48. panic("unexpected any value")
  49. }
  50. }
  51. return followValue(descriptor, value, f)
  52. })
  53. }
  54. func followValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Value, f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) bool {
  55. fd := V2JsonProtobufFollowerFieldDescriptor{descriptor}
  56. if descriptor.Kind() == protoreflect.MessageKind {
  57. if descriptor.IsList() {
  58. value2 := protoreflect.ValueOfList(V2JsonProtobufListFollower{value.List()})
  59. return f(fd, value2)
  60. }
  61. if descriptor.IsMap() {
  62. value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map(), descriptor.MapValue()})
  63. return f(fd, value2)
  64. }
  65. value2 := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  66. return f(fd, value2)
  67. }
  68. return f(fd, value)
  69. }
  70. func (v *V2JsonProtobufFollower) Has(descriptor protoreflect.FieldDescriptor) bool {
  71. panic("implement me")
  72. }
  73. func (v *V2JsonProtobufFollower) Clear(descriptor protoreflect.FieldDescriptor) {
  74. v.Message.Clear(descriptor)
  75. }
  76. func (v *V2JsonProtobufFollower) Set(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) {
  77. switch descriptor.(type) {
  78. case V2JsonProtobufFollowerFieldDescriptor:
  79. v.Message.Set(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor, value)
  80. case *V2JsonProtobufFollowerFieldDescriptor:
  81. v.Message.Set(descriptor.(*V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor, value)
  82. case *V2JsonProtobufAnyValueField:
  83. protodata := value.Message()
  84. bytesw, err := proto.MarshalOptions{AllowPartial: true}.Marshal(&V2JsonProtobufAnyValueFieldReturn{protodata})
  85. if err != nil {
  86. panic(err)
  87. }
  88. v.Message.Set(descriptor.(*V2JsonProtobufAnyValueField).FieldDescriptor, protoreflect.ValueOfBytes(bytesw))
  89. default:
  90. v.Message.Set(descriptor, value)
  91. }
  92. }
  93. func (v *V2JsonProtobufFollower) Mutable(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
  94. value := v.Message.Mutable(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor)
  95. if descriptor.IsList() {
  96. return protoreflect.ValueOfList(&V2JsonProtobufListFollower{value.List()})
  97. }
  98. if descriptor.IsMap() {
  99. return protoreflect.ValueOfMap(&V2JsonProtobufMapFollower{value.Map(), descriptor})
  100. }
  101. if descriptor.Kind() == protoreflect.MessageKind {
  102. return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  103. }
  104. return value
  105. }
  106. func (v *V2JsonProtobufFollower) NewField(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
  107. if _, ok := descriptor.(*V2JsonProtobufAnyValueField); ok {
  108. url := v.Message.Get(v.Message.Descriptor().Fields().ByName("type_url")).String()
  109. v2type := serial.V2TypeFromURL(url)
  110. instance, err := serial.GetInstance(v2type)
  111. if err != nil {
  112. panic(err)
  113. }
  114. newvalue := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{instance.(proto.Message).ProtoReflect()})
  115. return newvalue
  116. }
  117. value := v.Message.NewField(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor)
  118. newvalue := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  119. return newvalue
  120. }
  121. func (v *V2JsonProtobufFollower) WhichOneof(descriptor protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
  122. panic("implement me")
  123. }
  124. func (v *V2JsonProtobufFollower) GetUnknown() protoreflect.RawFields {
  125. panic("implement me")
  126. }
  127. func (v *V2JsonProtobufFollower) SetUnknown(fields protoreflect.RawFields) {
  128. v.Message.SetUnknown(fields)
  129. }
  130. func (v *V2JsonProtobufFollower) IsValid() bool {
  131. return v.Message.IsValid()
  132. }
  133. func (v *V2JsonProtobufFollower) ProtoReflect() protoreflect.Message {
  134. return v
  135. }
  136. func (v *V2JsonProtobufFollower) Descriptor() protoreflect.MessageDescriptor {
  137. fullname := v.Message.Descriptor().FullName()
  138. if fullname == "google.protobuf.Any" {
  139. desc := &V2JsonProtobufAnyTypeDescriptor{(&anypb.Any{}).ProtoReflect().Descriptor()}
  140. return desc
  141. }
  142. return &V2JsonProtobufFollowerDescriptor{v.Message.Descriptor()}
  143. }
  144. func (v *V2JsonProtobufFollower) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
  145. panic("implement me")
  146. }
  147. type V2JsonProtobufFollowerDescriptor struct {
  148. protoreflect.MessageDescriptor
  149. }
  150. func (v *V2JsonProtobufFollowerDescriptor) Fields() protoreflect.FieldDescriptors {
  151. return &V2JsonProtobufFollowerFields{v.MessageDescriptor.Fields()}
  152. }
  153. type V2JsonProtobufFollowerFields struct {
  154. protoreflect.FieldDescriptors
  155. }
  156. func (v *V2JsonProtobufFollowerFields) ByJSONName(s string) protoreflect.FieldDescriptor {
  157. return V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByJSONName(s)}
  158. }
  159. func (v *V2JsonProtobufFollowerFields) ByTextName(s string) protoreflect.FieldDescriptor {
  160. return V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByTextName(s)}
  161. }