any.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # Protocol Buffers - Google's data interchange format
  2. # Copyright 2008 Google Inc. All rights reserved.
  3. #
  4. # Use of this source code is governed by a BSD-style
  5. # license that can be found in the LICENSE file or at
  6. # https://developers.google.com/open-source/licenses/bsd
  7. """Contains the Any helper APIs."""
  8. from typing import Optional, TypeVar
  9. from google.protobuf import descriptor
  10. from google.protobuf.message import Message
  11. from google.protobuf.any_pb2 import Any
  12. _MessageT = TypeVar('_MessageT', bound=Message)
  13. def pack(
  14. msg: Message,
  15. type_url_prefix: Optional[str] = 'type.googleapis.com/',
  16. deterministic: Optional[bool] = None,
  17. ) -> Any:
  18. any_msg = Any()
  19. any_msg.Pack(
  20. msg=msg, type_url_prefix=type_url_prefix, deterministic=deterministic
  21. )
  22. return any_msg
  23. def unpack(any_msg: Any, msg: Message) -> bool:
  24. return any_msg.Unpack(msg=msg)
  25. def unpack_as(any_msg: Any, message_type: type[_MessageT]) -> _MessageT:
  26. unpacked = message_type()
  27. if unpack(any_msg, unpacked):
  28. return unpacked
  29. else:
  30. raise TypeError(
  31. f'Attempted to unpack {type_name(any_msg)} to'
  32. f' {message_type.__qualname__}'
  33. )
  34. def type_name(any_msg: Any) -> str:
  35. return any_msg.TypeName()
  36. def is_type(any_msg: Any, des: descriptor.Descriptor) -> bool:
  37. return any_msg.Is(des)