dynamic.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  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. typ messageType
  30. known map[pref.FieldNumber]pref.Value
  31. ext map[pref.FieldNumber]pref.FieldDescriptor
  32. unknown pref.RawFields
  33. }
  34. // NewMessage creates a new message with the provided descriptor.
  35. func NewMessage(desc pref.MessageDescriptor) *Message {
  36. return &Message{
  37. typ: messageType{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.typ.desc
  53. }
  54. // Type returns the message type.
  55. func (m *Message) Type() pref.MessageType {
  56. return m.typ
  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 fd.IsExtension() {
  111. if fd != m.ext[num] {
  112. return fd.(pref.ExtensionTypeDescriptor).Type().Zero()
  113. }
  114. return m.known[num]
  115. }
  116. if v, ok := m.known[num]; ok {
  117. return v
  118. }
  119. switch {
  120. case fd.IsMap():
  121. return pref.ValueOf(&dynamicMap{desc: fd})
  122. case fd.IsList():
  123. return pref.ValueOf(emptyList{desc: fd})
  124. case fd.Message() != nil:
  125. return pref.ValueOf(&Message{typ: messageType{fd.Message()}})
  126. case fd.Kind() == pref.BytesKind:
  127. return pref.ValueOf(append([]byte(nil), fd.Default().Bytes()...))
  128. default:
  129. return fd.Default()
  130. }
  131. }
  132. // Mutable returns a mutable reference to a repeated, map, or message field.
  133. // See protoreflect.Message for details.
  134. func (m *Message) Mutable(fd pref.FieldDescriptor) pref.Value {
  135. m.checkField(fd)
  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. if m.known == nil {
  140. panic(errors.New("%v: modification of read-only message", fd.FullName()))
  141. }
  142. num := fd.Number()
  143. if fd.IsExtension() {
  144. if fd != m.ext[num] {
  145. m.ext[num] = fd
  146. m.known[num] = fd.(pref.ExtensionTypeDescriptor).Type().New()
  147. }
  148. return m.known[num]
  149. }
  150. if v, ok := m.known[num]; ok {
  151. return v
  152. }
  153. m.clearOtherOneofFields(fd)
  154. m.known[num] = m.NewField(fd)
  155. if fd.IsExtension() {
  156. m.ext[num] = fd
  157. }
  158. return m.known[num]
  159. }
  160. // Set stores a value in a field.
  161. // See protoreflect.Message for details.
  162. func (m *Message) Set(fd pref.FieldDescriptor, v pref.Value) {
  163. m.checkField(fd)
  164. if m.known == nil {
  165. panic(errors.New("%v: modification of read-only message", fd.FullName()))
  166. }
  167. if fd.IsExtension() {
  168. if !fd.(pref.ExtensionTypeDescriptor).Type().IsValidValue(v) {
  169. panic(errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface()))
  170. }
  171. m.ext[fd.Number()] = fd
  172. } else {
  173. typecheck(fd, v)
  174. }
  175. m.clearOtherOneofFields(fd)
  176. m.known[fd.Number()] = v
  177. }
  178. func (m *Message) clearOtherOneofFields(fd pref.FieldDescriptor) {
  179. od := fd.ContainingOneof()
  180. if od == nil {
  181. return
  182. }
  183. num := fd.Number()
  184. for i := 0; i < od.Fields().Len(); i++ {
  185. if n := od.Fields().Get(i).Number(); n != num {
  186. delete(m.known, n)
  187. }
  188. }
  189. }
  190. // NewMessage returns a newly-allocated message assignable to a field.
  191. // See protoreflect.Message for details.
  192. func (m *Message) NewMessage(fd pref.FieldDescriptor) pref.Message {
  193. m.checkField(fd)
  194. md := fd.Message()
  195. if fd.Cardinality() == pref.Repeated || md == nil {
  196. panic(errors.New("%v: field is not of non-repeated message type", fd.FullName()))
  197. }
  198. return NewMessage(md).ProtoReflect()
  199. }
  200. // NewField returns a new value for assignable to the field of a given descriptor.
  201. // See protoreflect.Message for details.
  202. func (m *Message) NewField(fd pref.FieldDescriptor) pref.Value {
  203. m.checkField(fd)
  204. switch {
  205. case fd.IsExtension():
  206. return fd.(pref.ExtensionTypeDescriptor).Type().New()
  207. case fd.IsMap():
  208. return pref.ValueOf(&dynamicMap{
  209. desc: fd,
  210. mapv: make(map[interface{}]pref.Value),
  211. })
  212. case fd.IsList():
  213. return pref.ValueOf(&dynamicList{desc: fd})
  214. case fd.Message() != nil:
  215. return pref.ValueOf(NewMessage(fd.Message()).ProtoReflect())
  216. default:
  217. return fd.Default()
  218. }
  219. }
  220. // WhichOneof reports which field in a oneof is populated, returning nil if none are populated.
  221. // See protoreflect.Message for details.
  222. func (m *Message) WhichOneof(od pref.OneofDescriptor) pref.FieldDescriptor {
  223. for i := 0; i < od.Fields().Len(); i++ {
  224. fd := od.Fields().Get(i)
  225. if m.Has(fd) {
  226. return fd
  227. }
  228. }
  229. return nil
  230. }
  231. // GetUnknown returns the raw unknown fields.
  232. // See protoreflect.Message for details.
  233. func (m *Message) GetUnknown() pref.RawFields {
  234. return m.unknown
  235. }
  236. // SetUnknown sets the raw unknown fields.
  237. // See protoreflect.Message for details.
  238. func (m *Message) SetUnknown(r pref.RawFields) {
  239. if m.known == nil {
  240. panic(errors.New("%v: modification of read-only message", m.typ.desc.FullName()))
  241. }
  242. m.unknown = r
  243. }
  244. func (m *Message) checkField(fd pref.FieldDescriptor) {
  245. if fd.IsExtension() && fd.ContainingMessage().FullName() == m.Descriptor().FullName() {
  246. if _, ok := fd.(pref.ExtensionTypeDescriptor); !ok {
  247. panic(errors.New("%v: extension field descriptor does not implement ExtensionTypeDescriptor", fd.FullName()))
  248. }
  249. return
  250. }
  251. if fd.Parent() == m.Descriptor() {
  252. return
  253. }
  254. fields := m.Descriptor().Fields()
  255. index := fd.Index()
  256. if index >= fields.Len() || fields.Get(index) != fd {
  257. panic(errors.New("%v: field descriptor does not belong to this message", fd.FullName()))
  258. }
  259. }
  260. type messageType struct {
  261. desc pref.MessageDescriptor
  262. }
  263. // NewMessageType creates a new MessageType with the provided descriptor.
  264. //
  265. // MessageTypes created by this package are equal if their descriptors are equal.
  266. // That is, if md1 == md2, then NewMessageType(md1) == NewMessageType(md2).
  267. func NewMessageType(desc pref.MessageDescriptor) pref.MessageType {
  268. return messageType{desc}
  269. }
  270. func (mt messageType) New() pref.Message { return NewMessage(mt.desc) }
  271. func (mt messageType) Zero() pref.Message { return NewMessage(mt.desc) }
  272. func (mt messageType) GoType() reflect.Type { return reflect.TypeOf((*Message)(nil)) }
  273. func (mt messageType) Descriptor() pref.MessageDescriptor { return mt.desc }
  274. type emptyList struct {
  275. desc pref.FieldDescriptor
  276. }
  277. func (x emptyList) Len() int { return 0 }
  278. func (x emptyList) Get(n int) pref.Value { panic(errors.New("out of range")) }
  279. func (x emptyList) Set(n int, v pref.Value) { panic(errors.New("modification of immutable list")) }
  280. func (x emptyList) Append(v pref.Value) { panic(errors.New("modification of immutable list")) }
  281. func (x emptyList) Truncate(n int) { panic(errors.New("modification of immutable list")) }
  282. func (x emptyList) NewMessage() pref.Message {
  283. md := x.desc.Message()
  284. if md == nil {
  285. panic(errors.New("list is not of message type"))
  286. }
  287. return NewMessage(md).ProtoReflect()
  288. }
  289. func (x emptyList) NewElement() pref.Value {
  290. return newListEntry(x.desc)
  291. }
  292. type dynamicList struct {
  293. desc pref.FieldDescriptor
  294. list []pref.Value
  295. }
  296. func (x *dynamicList) Len() int {
  297. return len(x.list)
  298. }
  299. func (x *dynamicList) Get(n int) pref.Value {
  300. return x.list[n]
  301. }
  302. func (x *dynamicList) Set(n int, v pref.Value) {
  303. typecheckSingular(x.desc, v)
  304. x.list[n] = v
  305. }
  306. func (x *dynamicList) Append(v pref.Value) {
  307. typecheckSingular(x.desc, v)
  308. x.list = append(x.list, v)
  309. }
  310. func (x *dynamicList) Truncate(n int) {
  311. // Zero truncated elements to avoid keeping data live.
  312. for i := n; i < len(x.list); i++ {
  313. x.list[i] = pref.Value{}
  314. }
  315. x.list = x.list[:n]
  316. }
  317. func (x *dynamicList) NewMessage() pref.Message {
  318. md := x.desc.Message()
  319. if md == nil {
  320. panic(errors.New("list is not of message type"))
  321. }
  322. return NewMessage(md).ProtoReflect()
  323. }
  324. func (x *dynamicList) NewElement() pref.Value {
  325. return newListEntry(x.desc)
  326. }
  327. type dynamicMap struct {
  328. desc pref.FieldDescriptor
  329. mapv map[interface{}]pref.Value
  330. }
  331. func (x *dynamicMap) Get(k pref.MapKey) pref.Value { return x.mapv[k.Interface()] }
  332. func (x *dynamicMap) Set(k pref.MapKey, v pref.Value) {
  333. typecheckSingular(x.desc.MapKey(), k.Value())
  334. typecheckSingular(x.desc.MapValue(), v)
  335. x.mapv[k.Interface()] = v
  336. }
  337. func (x *dynamicMap) Has(k pref.MapKey) bool { return x.Get(k).IsValid() }
  338. func (x *dynamicMap) Clear(k pref.MapKey) { delete(x.mapv, k.Interface()) }
  339. func (x *dynamicMap) Len() int { return len(x.mapv) }
  340. func (x *dynamicMap) NewMessage() pref.Message {
  341. md := x.desc.MapValue().Message()
  342. if md == nil {
  343. panic(errors.New("map value is not of message type"))
  344. }
  345. return NewMessage(md).ProtoReflect()
  346. }
  347. func (x *dynamicMap) NewValue() pref.Value {
  348. if md := x.desc.MapValue().Message(); md != nil {
  349. return pref.ValueOf(NewMessage(md).ProtoReflect())
  350. }
  351. return x.desc.MapValue().Default()
  352. }
  353. func (x *dynamicMap) Range(f func(pref.MapKey, pref.Value) bool) {
  354. for k, v := range x.mapv {
  355. if !f(pref.ValueOf(k).MapKey(), v) {
  356. return
  357. }
  358. }
  359. }
  360. func isSet(fd pref.FieldDescriptor, v pref.Value) bool {
  361. switch {
  362. case fd.IsMap():
  363. return v.Map().Len() > 0
  364. case fd.IsList():
  365. return v.List().Len() > 0
  366. case fd.ContainingOneof() != nil:
  367. return true
  368. case fd.Syntax() == pref.Proto3:
  369. switch fd.Kind() {
  370. case pref.BoolKind:
  371. return v.Bool()
  372. case pref.EnumKind:
  373. return v.Enum() != 0
  374. case pref.Int32Kind, pref.Sint32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed32Kind, pref.Sfixed64Kind:
  375. return v.Int() != 0
  376. case pref.Uint32Kind, pref.Uint64Kind, pref.Fixed32Kind, pref.Fixed64Kind:
  377. return v.Uint() != 0
  378. case pref.FloatKind, pref.DoubleKind:
  379. return v.Float() != 0 || math.Signbit(v.Float())
  380. case pref.StringKind:
  381. return v.String() != ""
  382. case pref.BytesKind:
  383. return len(v.Bytes()) > 0
  384. }
  385. }
  386. return true
  387. }
  388. func typecheck(fd pref.FieldDescriptor, v pref.Value) {
  389. if err := typeIsValid(fd, v); err != nil {
  390. panic(err)
  391. }
  392. }
  393. func typeIsValid(fd pref.FieldDescriptor, v pref.Value) error {
  394. switch {
  395. case fd.IsMap():
  396. if mapv, ok := v.Interface().(*dynamicMap); !ok || mapv.desc != fd {
  397. return errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface())
  398. }
  399. return nil
  400. case fd.IsList():
  401. switch list := v.Interface().(type) {
  402. case *dynamicList:
  403. if list.desc == fd {
  404. return nil
  405. }
  406. case emptyList:
  407. if list.desc == fd {
  408. return nil
  409. }
  410. }
  411. return errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface())
  412. default:
  413. return singularTypeIsValid(fd, v)
  414. }
  415. }
  416. func typecheckSingular(fd pref.FieldDescriptor, v pref.Value) {
  417. if err := singularTypeIsValid(fd, v); err != nil {
  418. panic(err)
  419. }
  420. }
  421. func singularTypeIsValid(fd pref.FieldDescriptor, v pref.Value) error {
  422. vi := v.Interface()
  423. var ok bool
  424. switch fd.Kind() {
  425. case pref.BoolKind:
  426. _, ok = vi.(bool)
  427. case pref.EnumKind:
  428. // We could check against the valid set of enum values, but do not.
  429. _, ok = vi.(pref.EnumNumber)
  430. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  431. _, ok = vi.(int32)
  432. case pref.Uint32Kind, pref.Fixed32Kind:
  433. _, ok = vi.(uint32)
  434. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  435. _, ok = vi.(int64)
  436. case pref.Uint64Kind, pref.Fixed64Kind:
  437. _, ok = vi.(uint64)
  438. case pref.FloatKind:
  439. _, ok = vi.(float32)
  440. case pref.DoubleKind:
  441. _, ok = vi.(float64)
  442. case pref.StringKind:
  443. _, ok = vi.(string)
  444. case pref.BytesKind:
  445. _, ok = vi.([]byte)
  446. case pref.MessageKind, pref.GroupKind:
  447. var m pref.Message
  448. m, ok = vi.(pref.Message)
  449. if ok && m.Descriptor().FullName() != fd.Message().FullName() {
  450. return errors.New("%v: assigning invalid message type %v", fd.FullName(), m.Descriptor().FullName())
  451. }
  452. if dm, ok := vi.(*Message); ok && dm.known == nil {
  453. return errors.New("%v: assigning invalid zero-value message", fd.FullName())
  454. }
  455. }
  456. if !ok {
  457. return errors.New("%v: assigning invalid type %T", fd.FullName(), v.Interface())
  458. }
  459. return nil
  460. }
  461. func newListEntry(fd pref.FieldDescriptor) pref.Value {
  462. switch fd.Kind() {
  463. case pref.BoolKind:
  464. return pref.ValueOf(false)
  465. case pref.EnumKind:
  466. return pref.ValueOf(fd.Enum().Values().Get(0).Number())
  467. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  468. return pref.ValueOf(int32(0))
  469. case pref.Uint32Kind, pref.Fixed32Kind:
  470. return pref.ValueOf(uint32(0))
  471. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  472. return pref.ValueOf(int64(0))
  473. case pref.Uint64Kind, pref.Fixed64Kind:
  474. return pref.ValueOf(uint64(0))
  475. case pref.FloatKind:
  476. return pref.ValueOf(float32(0))
  477. case pref.DoubleKind:
  478. return pref.ValueOf(float64(0))
  479. case pref.StringKind:
  480. return pref.ValueOf("")
  481. case pref.BytesKind:
  482. return pref.ValueOf(([]byte)(nil))
  483. case pref.MessageKind, pref.GroupKind:
  484. return pref.ValueOf(NewMessage(fd.Message()).ProtoReflect())
  485. }
  486. panic(errors.New("%v: unknown kind %v", fd.FullName(), fd.Kind()))
  487. }
  488. // extensionType is a dynamic protoreflect.ExtensionType.
  489. type extensionType struct {
  490. desc extensionTypeDescriptor
  491. }
  492. // NewExtensionType creates a new ExtensionType with the provided descriptor.
  493. //
  494. // Dynamic ExtensionTypes with the same descriptor compare as equal. That is,
  495. // if xd1 == xd2, then NewExtensionType(xd1) == NewExtensionType(xd2).
  496. //
  497. // The InterfaceOf and ValueOf methods of the extension type are defined as:
  498. //
  499. // func (xt extensionType) ValueOf(iv interface{}) protoreflect.Value {
  500. // return protoreflect.ValueOf(iv)
  501. // }
  502. //
  503. // func (xt extensionType) InterfaceOf(v protoreflect.Value) interface{} {
  504. // return v.Interface()
  505. // }
  506. //
  507. // The Go type used by the proto.GetExtension and proto.SetExtension functions
  508. // is determined by these methods, and is therefore equivalent to the Go type
  509. // used to represent a protoreflect.Value. See the protoreflect.Value
  510. // documentation for more details.
  511. func NewExtensionType(desc pref.ExtensionDescriptor) pref.ExtensionType {
  512. if xt, ok := desc.(pref.ExtensionTypeDescriptor); ok {
  513. desc = xt.Descriptor()
  514. }
  515. return extensionType{extensionTypeDescriptor{desc}}
  516. }
  517. func (xt extensionType) New() pref.Value {
  518. switch {
  519. case xt.desc.IsMap():
  520. return pref.ValueOf(&dynamicMap{
  521. desc: xt.desc,
  522. mapv: make(map[interface{}]pref.Value),
  523. })
  524. case xt.desc.IsList():
  525. return pref.ValueOf(&dynamicList{desc: xt.desc})
  526. case xt.desc.Message() != nil:
  527. return pref.ValueOf(NewMessage(xt.desc.Message()))
  528. default:
  529. return xt.desc.Default()
  530. }
  531. }
  532. func (xt extensionType) Zero() pref.Value {
  533. switch {
  534. case xt.desc.IsMap():
  535. return pref.ValueOf(&dynamicMap{desc: xt.desc})
  536. case xt.desc.Cardinality() == pref.Repeated:
  537. return pref.ValueOf(emptyList{desc: xt.desc})
  538. case xt.desc.Message() != nil:
  539. return pref.ValueOf(&Message{typ: messageType{xt.desc.Message()}})
  540. default:
  541. return xt.desc.Default()
  542. }
  543. }
  544. func (xt extensionType) GoType() reflect.Type {
  545. return reflect.TypeOf(xt.InterfaceOf(xt.New()))
  546. }
  547. func (xt extensionType) TypeDescriptor() pref.ExtensionTypeDescriptor {
  548. return xt.desc
  549. }
  550. func (xt extensionType) ValueOf(iv interface{}) pref.Value {
  551. v := pref.ValueOf(iv)
  552. typecheck(xt.desc, v)
  553. return v
  554. }
  555. func (xt extensionType) InterfaceOf(v pref.Value) interface{} {
  556. typecheck(xt.desc, v)
  557. return v.Interface()
  558. }
  559. func (xt extensionType) IsValidInterface(iv interface{}) bool {
  560. return typeIsValid(xt.desc, pref.ValueOf(iv)) == nil
  561. }
  562. func (xt extensionType) IsValidValue(v pref.Value) bool {
  563. return typeIsValid(xt.desc, v) == nil
  564. }
  565. type extensionTypeDescriptor struct {
  566. pref.ExtensionDescriptor
  567. }
  568. func (xt extensionTypeDescriptor) Type() pref.ExtensionType {
  569. return extensionType{xt}
  570. }
  571. func (xt extensionTypeDescriptor) Descriptor() pref.ExtensionDescriptor {
  572. return xt.ExtensionDescriptor
  573. }