o
    ˷e                     @   sb   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlmZ dd Z	dd	d
Z
dd ZdS )zDynamic Protobuf class creator.    )OrderedDictN)descriptor_pb2)
descriptor)message_factoryc                 C   s   | j |}| |}|S )a8  Get a proto class from the MessageFactory by name.

  Args:
    factory: a MessageFactory instance.
    full_name: str, the fully qualified name of the proto type.
  Returns:
    A class, for the type identified by full_name.
  Raises:
    KeyError, if the proto is not found in the factory's descriptor pool.
  )poolFindMessageTypeByNameGetPrototype)factory	full_nameproto_descriptor	proto_cls r   T/var/www/ideatree/venv/lib/python3.10/site-packages/google/protobuf/proto_builder.py_GetMessageFromFactory*   s   
r   c           
      C   s   t j|d}|durzt||}|W S  ty   Y nw |  }t| ts)t|}t	 }|D ]\}}|
|d |
t|d q/| d }	|du rhd|  }zt||}|W S  tyg   Y nw |jt|	|| t||S )a  Create a Protobuf class whose fields are basic types.

  Note: this doesn't validate field names!

  Args:
    fields: dict of {name: field_type} mappings for each field in the proto. If
        this is an OrderedDict the order will be maintained, otherwise the
        fields will be sorted by name.
    full_name: optional str, the fully-qualified name of the proto type.
    pool: optional DescriptorPool instance.
  Returns:
    a class, the new protobuf class with a FileDescriptor.
  )r   Nzutf-8z.protoz6net.proto2.python.public.proto_builder.AnonymousProto_)r   MessageFactoryr   KeyErroritems
isinstancer   sortedhashlibsha1updateencodestr	hexdigestr   Add_MakeFileDescriptorProto)
fieldsr
   r   r	   r   field_itemsfields_hashf_namef_typeproto_file_namer   r   r   MakeSimpleProtoClass:   s<   




r#   c                 C   s   | dd\}}t }tj|dd| |_||_|j	
 }||_t|dD ]+\}\}}	|j
 }
||
_|tjjkrH|tjjtjj d 7 }||
_tjj|
_|	|
_q(|S )zAPopulate FileDescriptorProto for MessageFactory's DescriptorPool..   /)rsplitr   FileDescriptorProtoospathjoinreplacenamepackagemessage_typeadd	enumeratefieldr   FieldDescriptorFIRST_RESERVED_FIELD_NUMBERLAST_RESERVED_FIELD_NUMBERnumberFieldDescriptorProtoLABEL_OPTIONALlabeltype)r"   r
   r   r.   r-   
file_proto
desc_protof_numberr    r!   field_protor   r   r   r   r   s*   


r   )NN)__doc__collectionsr   r   r)   google.protobufr   r   r   r   r#   r   r   r   r   r   <module>   s   
8