dynamic.go 11 KB

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