dynamic.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // Package dynamicpb creates protocol buffer messages using runtime type information.
  5. package dynamicpb
  6. import (
  7. "math"
  8. "reflect"
  9. "google.golang.org/protobuf/internal/errors"
  10. pref "google.golang.org/protobuf/reflect/protoreflect"
  11. protoimpl "google.golang.org/protobuf/runtime/protoimpl"
  12. )
  13. // A Message is a dynamically constructed protocol buffer message.
  14. //
  15. // Message implements the proto.Message interface, and may be used with all
  16. // standard proto package functions such as Marshal, Unmarshal, and so forth.
  17. //
  18. // Message also implements the protoreflect.Message interface. See the protoreflect
  19. // package documentation for that interface for how to get and set fields and
  20. // otherwise interact with the contents of a Message.
  21. //
  22. // Reflection API functions which construct messages, such as NewField,
  23. // return new dynamic messages of the appropriate type. Functions which take
  24. // messages, such as Set for a message-value field, will accept any message
  25. // with a compatible type.
  26. //
  27. // Operations which modify a Message are not safe for concurrent use.
  28. type Message struct {
  29. desc pref.MessageDescriptor
  30. known map[pref.FieldNumber]pref.Value
  31. ext map[pref.FieldNumber]pref.FieldDescriptor
  32. unknown pref.RawFields
  33. }
  34. // New creates a new message with the provided descriptor.
  35. func New(desc pref.MessageDescriptor) *Message {
  36. return &Message{
  37. desc: desc,
  38. known: make(map[pref.FieldNumber]pref.Value),
  39. ext: make(map[pref.FieldNumber]pref.FieldDescriptor),
  40. }
  41. }
  42. // ProtoReflect implements the protoreflect.ProtoMessage interface.
  43. func (m *Message) ProtoReflect() pref.Message {
  44. return m
  45. }
  46. // String returns a string representation of a message.
  47. func (m *Message) String() string {
  48. return protoimpl.X.MessageStringOf(m)
  49. }
  50. // Descriptor returns the message descriptor.
  51. func (m *Message) Descriptor() pref.MessageDescriptor {
  52. return m.desc
  53. }
  54. // Type returns the message type.
  55. func (m *Message) Type() pref.MessageType {
  56. return (*messageType)(m)
  57. }
  58. // New returns a newly allocated empty message with the same descriptor.
  59. // See protoreflect.Message for details.
  60. func (m *Message) New() pref.Message {
  61. return m.Type().New()
  62. }
  63. // Interface returns the message.
  64. // See protoreflect.Message for details.
  65. func (m *Message) Interface() pref.ProtoMessage {
  66. return m
  67. }
  68. // Range visits every populated field in undefined order.
  69. // See protoreflect.Message for details.
  70. func (m *Message) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
  71. for num, v := range m.known {
  72. fd := m.ext[num]
  73. if fd == nil {
  74. fd = m.Descriptor().Fields().ByNumber(num)
  75. if !isSet(fd, v) {
  76. continue
  77. }
  78. }
  79. if !f(fd, v) {
  80. return
  81. }
  82. }
  83. }
  84. // Range reports whether a field is populated.
  85. // See protoreflect.Message for details.
  86. func (m *Message) Has(fd pref.FieldDescriptor) bool {
  87. m.checkField(fd)
  88. if fd.IsExtension() {
  89. return m.ext[fd.Number()] == fd
  90. }
  91. v, ok := m.known[fd.Number()]
  92. if !ok {
  93. return false
  94. }
  95. return isSet(fd, v)
  96. }
  97. // Clear clears a field.
  98. // See protoreflect.Message for details.
  99. func (m *Message) Clear(fd pref.FieldDescriptor) {
  100. m.checkField(fd)
  101. num := fd.Number()
  102. delete(m.known, num)
  103. delete(m.ext, num)
  104. }
  105. // Get returns the value of a field.
  106. // See protoreflect.Message for details.
  107. func (m *Message) Get(fd pref.FieldDescriptor) pref.Value {
  108. m.checkField(fd)
  109. num := fd.Number()
  110. if v, ok := m.known[num]; ok {
  111. if !fd.IsExtension() || fd == m.ext[num] {
  112. return v
  113. }
  114. }
  115. switch {
  116. case fd.IsMap():
  117. return pref.ValueOf(&dynamicMap{desc: fd})
  118. case fd.Cardinality() == pref.Repeated:
  119. return pref.ValueOf(emptyList{desc: fd})
  120. case fd.Kind() == pref.BytesKind:
  121. return pref.ValueOf(append([]byte(nil), fd.Default().Bytes()...))
  122. default:
  123. return fd.Default()
  124. }
  125. }
  126. // Mutable returns a mutable reference to a repeated, map, or message field.
  127. // See protoreflect.Message for details.
  128. func (m *Message) Mutable(fd pref.FieldDescriptor) pref.Value {
  129. m.checkField(fd)
  130. num := fd.Number()
  131. if v, ok := m.known[num]; ok {
  132. if !fd.IsExtension() || fd == m.ext[num] {
  133. return v
  134. }
  135. }
  136. if !fd.IsMap() && !fd.IsList() && fd.Message() == nil {
  137. panic(errors.New("%v: getting mutable reference to non-composite type", fd.FullName()))
  138. }
  139. m.clearOtherOneofFields(fd)
  140. m.known[num] = m.NewField(fd)
  141. if fd.IsExtension() {
  142. m.ext[num] = fd
  143. }
  144. return m.known[num]
  145. }
  146. // Set stores a value in a field.
  147. // See protoreflect.Message for details.
  148. func (m *Message) Set(fd pref.FieldDescriptor, v pref.Value) {
  149. m.checkField(fd)
  150. switch {
  151. case fd.IsExtension():
  152. // Call InterfaceOf just to let the extension typecheck the value.
  153. _ = fd.(pref.ExtensionTypeDescriptor).Type().InterfaceOf(v)
  154. m.ext[fd.Number()] = fd
  155. case fd.IsMap():
  156. if mapv, ok := v.Interface().(*dynamicMap); !ok || mapv.desc != fd {
  157. panic(errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface()))
  158. }
  159. case fd.IsList():
  160. if list, ok := v.Interface().(*dynamicList); !ok || list.desc != fd {
  161. panic(errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface()))
  162. }
  163. default:
  164. typecheckSingular(fd, v)
  165. }
  166. m.clearOtherOneofFields(fd)
  167. m.known[fd.Number()] = v
  168. }
  169. func (m *Message) clearOtherOneofFields(fd pref.FieldDescriptor) {
  170. od := fd.ContainingOneof()
  171. if od == nil {
  172. return
  173. }
  174. num := fd.Number()
  175. for i := 0; i < od.Fields().Len(); i++ {
  176. if n := od.Fields().Get(i).Number(); n != num {
  177. delete(m.known, n)
  178. }
  179. }
  180. }
  181. // NewMessage returns a newly-allocated message assignable to a field.
  182. // See protoreflect.Message for details.
  183. func (m *Message) NewMessage(fd pref.FieldDescriptor) pref.Message {
  184. m.checkField(fd)
  185. md := fd.Message()
  186. if fd.Cardinality() == pref.Repeated || md == nil {
  187. panic(errors.New("%v: field is not of non-repeated message type", fd.FullName()))
  188. }
  189. return New(md).ProtoReflect()
  190. }
  191. // NewField returns a new value for assignable to the field of a given descriptor.
  192. // See protoreflect.Message for details.
  193. func (m *Message) NewField(fd pref.FieldDescriptor) pref.Value {
  194. m.checkField(fd)
  195. switch {
  196. case fd.IsExtension():
  197. return fd.(pref.ExtensionTypeDescriptor).Type().New()
  198. case fd.IsMap():
  199. return pref.ValueOf(&dynamicMap{
  200. desc: fd,
  201. mapv: make(map[interface{}]pref.Value),
  202. })
  203. case fd.IsList():
  204. return pref.ValueOf(&dynamicList{desc: fd})
  205. case fd.Message() != nil:
  206. return pref.ValueOf(New(fd.Message()).ProtoReflect())
  207. default:
  208. return fd.Default()
  209. }
  210. }
  211. // WhichOneof reports which field in a oneof is populated, returning nil if none are populated.
  212. // See protoreflect.Message for details.
  213. func (m *Message) WhichOneof(od pref.OneofDescriptor) pref.FieldDescriptor {
  214. for i := 0; i < od.Fields().Len(); i++ {
  215. fd := od.Fields().Get(i)
  216. if m.Has(fd) {
  217. return fd
  218. }
  219. }
  220. return nil
  221. }
  222. // GetUnknown returns the raw unknown fields.
  223. // See protoreflect.Message for details.
  224. func (m *Message) GetUnknown() pref.RawFields {
  225. return m.unknown
  226. }
  227. // SetUnknown sets the raw unknown fields.
  228. // See protoreflect.Message for details.
  229. func (m *Message) SetUnknown(r pref.RawFields) {
  230. m.unknown = r
  231. }
  232. func (m *Message) checkField(fd pref.FieldDescriptor) {
  233. if fd.IsExtension() && fd.ContainingMessage().FullName() == m.Descriptor().FullName() {
  234. if _, ok := fd.(pref.ExtensionTypeDescriptor); !ok {
  235. panic(errors.New("%v: extension field descriptor does not implement ExtensionTypeDescriptor", fd.FullName()))
  236. }
  237. return
  238. }
  239. if fd.Parent() == m.Descriptor() {
  240. return
  241. }
  242. fields := m.Descriptor().Fields()
  243. index := fd.Index()
  244. if index >= fields.Len() || fields.Get(index) != fd {
  245. panic(errors.New("%v: field descriptor does not belong to this message", fd.FullName()))
  246. }
  247. }
  248. type messageType Message
  249. func (mt *messageType) New() pref.Message { return New(mt.desc) }
  250. func (mt *messageType) Zero() pref.Message { return New(mt.desc) }
  251. func (mt *messageType) GoType() reflect.Type { return reflect.TypeOf((*Message)(nil)) }
  252. func (mt *messageType) Descriptor() pref.MessageDescriptor { return mt.desc }
  253. type emptyList struct {
  254. desc pref.FieldDescriptor
  255. }
  256. func (x emptyList) Len() int { return 0 }
  257. func (x emptyList) Get(n int) pref.Value { panic(errors.New("out of range")) }
  258. func (x emptyList) Set(n int, v pref.Value) { panic(errors.New("modification of immutable list")) }
  259. func (x emptyList) Append(v pref.Value) { panic(errors.New("modification of immutable list")) }
  260. func (x emptyList) Truncate(n int) { panic(errors.New("modification of immutable list")) }
  261. func (x emptyList) NewMessage() pref.Message {
  262. md := x.desc.Message()
  263. if md == nil {
  264. panic(errors.New("list is not of message type"))
  265. }
  266. return New(md).ProtoReflect()
  267. }
  268. func (x emptyList) NewElement() pref.Value {
  269. return newListEntry(x.desc)
  270. }
  271. type dynamicList struct {
  272. desc pref.FieldDescriptor
  273. list []pref.Value
  274. }
  275. func (x *dynamicList) Len() int {
  276. return len(x.list)
  277. }
  278. func (x *dynamicList) Get(n int) pref.Value {
  279. return x.list[n]
  280. }
  281. func (x *dynamicList) Set(n int, v pref.Value) {
  282. typecheckSingular(x.desc, v)
  283. x.list[n] = v
  284. }
  285. func (x *dynamicList) Append(v pref.Value) {
  286. typecheckSingular(x.desc, v)
  287. x.list = append(x.list, v)
  288. }
  289. func (x *dynamicList) Truncate(n int) {
  290. // Zero truncated elements to avoid keeping data live.
  291. for i := n; i < len(x.list); i++ {
  292. x.list[i] = pref.Value{}
  293. }
  294. x.list = x.list[:n]
  295. }
  296. func (x *dynamicList) NewMessage() pref.Message {
  297. md := x.desc.Message()
  298. if md == nil {
  299. panic(errors.New("list is not of message type"))
  300. }
  301. return New(md).ProtoReflect()
  302. }
  303. func (x *dynamicList) NewElement() pref.Value {
  304. return newListEntry(x.desc)
  305. }
  306. type dynamicMap struct {
  307. desc pref.FieldDescriptor
  308. mapv map[interface{}]pref.Value
  309. }
  310. func (x *dynamicMap) Get(k pref.MapKey) pref.Value { return x.mapv[k.Interface()] }
  311. func (x *dynamicMap) Set(k pref.MapKey, v pref.Value) {
  312. typecheckSingular(x.desc.MapKey(), k.Value())
  313. typecheckSingular(x.desc.MapValue(), v)
  314. x.mapv[k.Interface()] = v
  315. }
  316. func (x *dynamicMap) Has(k pref.MapKey) bool { return x.Get(k).IsValid() }
  317. func (x *dynamicMap) Clear(k pref.MapKey) { delete(x.mapv, k.Interface()) }
  318. func (x *dynamicMap) Len() int { return len(x.mapv) }
  319. func (x *dynamicMap) NewMessage() pref.Message {
  320. md := x.desc.MapValue().Message()
  321. if md == nil {
  322. panic(errors.New("map value is not of message type"))
  323. }
  324. return New(md).ProtoReflect()
  325. }
  326. func (x *dynamicMap) NewValue() pref.Value {
  327. if md := x.desc.MapValue().Message(); md != nil {
  328. return pref.ValueOf(New(md).ProtoReflect())
  329. }
  330. return x.desc.MapValue().Default()
  331. }
  332. func (x *dynamicMap) Range(f func(pref.MapKey, pref.Value) bool) {
  333. for k, v := range x.mapv {
  334. if !f(pref.ValueOf(k).MapKey(), v) {
  335. return
  336. }
  337. }
  338. }
  339. func isSet(fd pref.FieldDescriptor, v pref.Value) bool {
  340. switch {
  341. case fd.IsMap():
  342. return v.Map().Len() > 0
  343. case fd.IsList():
  344. return v.List().Len() > 0
  345. case fd.ContainingOneof() != nil:
  346. return true
  347. case fd.Syntax() == pref.Proto3:
  348. switch fd.Kind() {
  349. case pref.BoolKind:
  350. return v.Bool()
  351. case pref.EnumKind:
  352. return v.Enum() != 0
  353. case pref.Int32Kind, pref.Sint32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed32Kind, pref.Sfixed64Kind:
  354. return v.Int() != 0
  355. case pref.Uint32Kind, pref.Uint64Kind, pref.Fixed32Kind, pref.Fixed64Kind:
  356. return v.Uint() != 0
  357. case pref.FloatKind, pref.DoubleKind:
  358. return v.Float() != 0 || math.Signbit(v.Float())
  359. case pref.StringKind:
  360. return v.String() != ""
  361. case pref.BytesKind:
  362. return len(v.Bytes()) > 0
  363. }
  364. }
  365. return true
  366. }
  367. func typecheckSingular(fd pref.FieldDescriptor, v pref.Value) {
  368. vi := v.Interface()
  369. var ok bool
  370. switch fd.Kind() {
  371. case pref.BoolKind:
  372. _, ok = vi.(bool)
  373. case pref.EnumKind:
  374. // We could check against the valid set of enum values, but do not.
  375. _, ok = vi.(pref.EnumNumber)
  376. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  377. _, ok = vi.(int32)
  378. case pref.Uint32Kind, pref.Fixed32Kind:
  379. _, ok = vi.(uint32)
  380. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  381. _, ok = vi.(int64)
  382. case pref.Uint64Kind, pref.Fixed64Kind:
  383. _, ok = vi.(uint64)
  384. case pref.FloatKind:
  385. _, ok = vi.(float32)
  386. case pref.DoubleKind:
  387. _, ok = vi.(float64)
  388. case pref.StringKind:
  389. _, ok = vi.(string)
  390. case pref.BytesKind:
  391. _, ok = vi.([]byte)
  392. case pref.MessageKind, pref.GroupKind:
  393. var m pref.Message
  394. m, ok = vi.(pref.Message)
  395. if ok && m.Descriptor().FullName() != fd.Message().FullName() {
  396. panic(errors.New("%v: assigning invalid message type %v", fd.FullName(), m.Descriptor().FullName()))
  397. }
  398. }
  399. if !ok {
  400. panic(errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface()))
  401. }
  402. }
  403. func newListEntry(fd pref.FieldDescriptor) pref.Value {
  404. switch fd.Kind() {
  405. case pref.BoolKind:
  406. return pref.ValueOf(false)
  407. case pref.EnumKind:
  408. return pref.ValueOf(fd.Enum().Values().Get(0).Number())
  409. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  410. return pref.ValueOf(int32(0))
  411. case pref.Uint32Kind, pref.Fixed32Kind:
  412. return pref.ValueOf(uint32(0))
  413. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  414. return pref.ValueOf(int64(0))
  415. case pref.Uint64Kind, pref.Fixed64Kind:
  416. return pref.ValueOf(uint64(0))
  417. case pref.FloatKind:
  418. return pref.ValueOf(float32(0))
  419. case pref.DoubleKind:
  420. return pref.ValueOf(float64(0))
  421. case pref.StringKind:
  422. return pref.ValueOf("")
  423. case pref.BytesKind:
  424. return pref.ValueOf(([]byte)(nil))
  425. case pref.MessageKind, pref.GroupKind:
  426. return pref.ValueOf(New(fd.Message()).ProtoReflect())
  427. }
  428. panic(errors.New("%v: unknown kind %v", fd.FullName(), fd.Kind()))
  429. }