o
    ‹¨Êh  ã                   @   sH   d Z ddlmZ ddlmZ G dd„ dejƒZee ¡ d�Zdd„ Zd	S )
aR  A database of Python protocol buffer generated symbols.

SymbolDatabase is the MessageFactory for messages generated at compile time,
and makes it easy to create new instances of a registered type, given only the
type's protocol buffer symbol name.

Example usage:

  db = symbol_database.SymbolDatabase()

  # Register symbols of interest, from one or multiple files.
  db.RegisterFileDescriptor(my_proto_pb2.DESCRIPTOR)
  db.RegisterMessage(my_proto_pb2.MyMessage)
  db.RegisterEnumDescriptor(my_proto_pb2.MyEnum.DESCRIPTOR)

  # The database can be used as a MessageFactory, to generate types based on
  # their name:
  types = db.GetMessages(['my_proto.proto'])
  my_message_instance = types['MyMessage']()

  # The database's underlying descriptor pool can be queried, so it's not
  # necessary to know a type's filename to be able to generate it:
  filename = db.pool.FindFileContainingSymbol('MyMessage')
  my_message_instance = db.GetMessages([filename])['MyMessage']()

  # This functionality is also provided directly via a convenience method:
  my_message_instance = db.GetSymbol('MyMessage')()
é    )Údescriptor_pool)Úmessage_factoryc                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚSymbolDatabasez'A database of Python generated symbols.c                 C   s   |j }|| j|< |  |¡ |S )z÷Registers the given message type in the local database.

    Calls to GetSymbol() and GetMessages() will return messages registered here.

    Args:
      message: a message.Message, to be registered.

    Returns:
      The provided message.
    )Ú
DESCRIPTORÚ_classesÚRegisterMessageDescriptor)ÚselfÚmessageÚdesc© r   úQ/var/www/html/env/lib/python3.10/site-packages/google/protobuf/symbol_database.pyÚRegisterMessageD   s   

zSymbolDatabase.RegisterMessagec                 C   ó   | j  |¡ dS )z‡Registers the given message descriptor in the local database.

    Args:
      message_descriptor: a descriptor.MessageDescriptor.
    N)ÚpoolÚAddDescriptor)r   Úmessage_descriptorr   r   r   r   U   s   z(SymbolDatabase.RegisterMessageDescriptorc                 C   s   | j  |¡ |S )z«Registers the given enum descriptor in the local database.

    Args:
      enum_descriptor: a descriptor.EnumDescriptor.

    Returns:
      The provided descriptor.
    )r   ÚAddEnumDescriptor)r   Úenum_descriptorr   r   r   ÚRegisterEnumDescriptor]   s   	z%SymbolDatabase.RegisterEnumDescriptorc                 C   r   )z´Registers the given service descriptor in the local database.

    Args:
      service_descriptor: a descriptor.ServiceDescriptor.

    Returns:
      The provided descriptor.
    N)r   ÚAddServiceDescriptor)r   Úservice_descriptorr   r   r   ÚRegisterServiceDescriptori   ó   	z(SymbolDatabase.RegisterServiceDescriptorc                 C   r   )z«Registers the given file descriptor in the local database.

    Args:
      file_descriptor: a descriptor.FileDescriptor.

    Returns:
      The provided descriptor.
    N)r   ÚAddFileDescriptor)r   Úfile_descriptorr   r   r   ÚRegisterFileDescriptort   r   z%SymbolDatabase.RegisterFileDescriptorc                 C   s   | j | j |¡ S )ax  Tries to find a symbol in the local database.

    Currently, this method only returns message.Message instances, however, if
    may be extended in future to support other symbol types.

    Args:
      symbol: A str, a protocol buffer symbol.

    Returns:
      A Python class corresponding to the symbol.

    Raises:
      KeyError: if the symbol could not be found.
    )r   r   ÚFindMessageTypeByName)r   Úsymbolr   r   r   Ú	GetSymbol   s   zSymbolDatabase.GetSymbolc                    sn   ‡ fdd„‰ i }|D ]*}| j  |¡}|j ¡ D ]}ˆ |ƒD ]}z
| j| ||j< W q ty2   Y qw qq
|S )a  Gets all registered messages from a specified file.

    Only messages already created and registered will be returned; (this is the
    case for imported _pb2 modules)
    But unlike MessageFactory, this version also returns already defined nested
    messages, but does not register any message extensions.

    Args:
      files: The file names to extract messages from.

    Returns:
      A dictionary mapping proto names to the message classes.

    Raises:
      KeyError: if a file could not be found.
    c                 3   s,   � | V  | j D ]}ˆ |ƒD ]}|V  qqdS )zCWalk a message Descriptor and recursively yields all message names.N)Únested_types)r
   Úmsg_descÚnested_desc©Ú_GetAllMessagesr   r   r#   ¤   s   €
ÿÿz3SymbolDatabase.GetMessages.<locals>._GetAllMessages)r   ÚFindFileByNameÚmessage_types_by_nameÚvaluesr   Ú	full_nameÚKeyError)r   ÚfilesÚresultÚ	file_nameÚ	file_descr    r
   r   r"   r   ÚGetMessages‘   s   þýÿzSymbolDatabase.GetMessagesN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r-   r   r   r   r   r   A   s    r   )r   c                   C   s   t S )z#Returns the default SymbolDatabase.)Ú_DEFAULTr   r   r   r   ÚDefault»   s   r3   N)r1   Úgoogle.protobufr   r   ÚMessageFactoryr   r3   r2   r   r   r   r   Ú<module>   s   w