o
    ˷e                      @   sT   d Z ddlm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 )aS  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')()
    )api_implementation)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 )a@  Registers the given message type in the local database.

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

    Args:
      message: A :class:`google.protobuf.message.Message` subclass (or
        instance); its descriptor will be registered.

    Returns:
      The provided message.
    )
DESCRIPTOR_classesRegisterMessageDescriptor)selfmessagedesc r   V/var/www/ideatree/venv/lib/python3.10/site-packages/google/protobuf/symbol_database.pyRegisterMessageE   s   

zSymbolDatabase.RegisterMessagec                 C       t  dkr| j| dS dS )zRegisters the given message descriptor in the local database.

    Args:
      message_descriptor (Descriptor): the message descriptor to add.
    pythonN)r   Typepool_AddDescriptor)r	   message_descriptorr   r   r   r   W      z(SymbolDatabase.RegisterMessageDescriptorc                 C   s   t  dkr| j| |S )zRegisters the given enum descriptor in the local database.

    Args:
      enum_descriptor (EnumDescriptor): The enum descriptor to register.

    Returns:
      EnumDescriptor: The provided descriptor.
    r   )r   r   r   _AddEnumDescriptor)r	   enum_descriptorr   r   r   RegisterEnumDescriptora   s   	z%SymbolDatabase.RegisterEnumDescriptorc                 C   r   )zRegisters the given service descriptor in the local database.

    Args:
      service_descriptor (ServiceDescriptor): the service descriptor to
        register.
    r   N)r   r   r   _AddServiceDescriptor)r	   service_descriptorr   r   r   RegisterServiceDescriptoro   s   z(SymbolDatabase.RegisterServiceDescriptorc                 C   r   )zRegisters the given file descriptor in the local database.

    Args:
      file_descriptor (FileDescriptor): The file descriptor to register.
    r   N)r   r   r   _InternalAddFileDescriptor)r	   file_descriptorr   r   r   RegisterFileDescriptorz   r   z%SymbolDatabase.RegisterFileDescriptorc                 C   s   | j | j| S )aw  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 (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 (list[str]): 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!   r0   r   r   r   r   r   B   s    

r   )r   c                   C   s   t S )z#Returns the default SymbolDatabase.)_DEFAULTr   r   r   r   Default   s   r6   N)
r4   google.protobuf.internalr   google.protobufr   r   MessageFactoryr   r6   r5   r   r   r   r   <module>   s   {