o
    e
                     @   s  d Z dZddlZddlmZ ddlZddl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	ZeejjejjejjejjgZeejjejjgZeejjejjgZd
ZdZdZe	dZ e	dZ!G dd de"Z#G dd de#Z$G dd de#Z%							d>ddZ&					d?ddZ'dd Z(G dd de)Z*dd  Z+d!d" Z,d#d$ Z-d@d%d&Z.		d@d'd(Z/e0e1fZ2G d)d* d*e)Z3dAd+d,Z4d-d. Z5d/d0 Z6d1d2 Z7d3d4gd5d6gd5d6gd7d8gd9d:gd5d6gd;d<gd=Z8dS )Bat  Contains routines for printing protocol messages in JSON format.

Simple usage example:

  # Create a proto object and serialize it to a json format string.
  message = my_proto_pb2.MyMessage(foo='bar')
  json_string = json_format.MessageToJson(message)

  # Parse a json format string to proto object.
  message = json_format.Parse(json_string, my_proto_pb2.MyMessage())
zjieluo@google.com (Jie Luo)    N)OrderedDict)methodcaller)type_checkers)
descriptor)symbol_databasez%Y-%m-%dT%H:%M:%SInfinityz	-InfinityNaNu.   [-](?![-])|(?<![-])[-]z\[[a-zA-Z0-9\._]*\]$c                   @      e Zd ZdZdS )Errorz'Top-level module error for json_format.N__name__
__module____qualname____doc__ r   r   KD:\Projects\ConvertPro\env\Lib\site-packages\google/protobuf/json_format.pyr
   N       r
   c                   @   r	   )SerializeToJsonErrorz&Thrown if serialization to JSON fails.Nr   r   r   r   r   r   R   r   r   c                   @   r	   )
ParseErrorz Thrown in case of parsing error.Nr   r   r   r   r   r   V   r   r   F   c           	      C   s    t |||||d}|| ||S )aR  Converts protobuf message to JSON format.

  Args:
    message: The protocol buffers message instance to serialize.
    including_default_value_fields: If True, singular primitive fields,
        repeated fields, and map fields will always be serialized.  If
        False, only serialize non-empty fields.  Singular message fields
        and oneof fields are not affected by this option.
    preserving_proto_field_name: If True, use the original proto field
        names as defined in the .proto file. If False, convert the field
        names to lowerCamelCase.
    indent: The JSON object will be pretty-printed with this indent level.
        An indent level of 0 or negative will only insert newlines.
    sort_keys: If True, then the output will be sorted by field names.
    use_integers_for_enums: If true, print integers instead of enum names.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
        default.
    float_precision: If set, use this to specify float field valid digits.

  Returns:
    A string containing the JSON formatted protocol buffer message.
  float_precision)_PrinterToJsonString)	messageincluding_default_value_fieldspreserving_proto_field_nameindent	sort_keysuse_integers_for_enumsdescriptor_poolr   printerr   r   r   MessageToJsonZ   s   r"   c                 C   s   t |||||d}|| S )a  Converts protobuf message to a dictionary.

  When the dictionary is encoded to JSON, it conforms to proto3 JSON spec.

  Args:
    message: The protocol buffers message instance to serialize.
    including_default_value_fields: If True, singular primitive fields,
        repeated fields, and map fields will always be serialized.  If
        False, only serialize non-empty fields.  Singular message fields
        and oneof fields are not affected by this option.
    preserving_proto_field_name: If True, use the original proto field
        names as defined in the .proto file. If False, convert the field
        names to lowerCamelCase.
    use_integers_for_enums: If true, print integers instead of enum names.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
        default.
    float_precision: If set, use this to specify float field valid digits.

  Returns:
    A dict representation of the protocol buffer message.
  r   )r   _MessageToJsonObject)r   r   r   r   r    r   r!   r   r   r   MessageToDict   s   
r$   c                 C   s"   | j tjjko| jjo| j jS N)typer   FieldDescriptorZTYPE_MESSAGEmessage_typeZhas_optionsZ
GetOptionsZ	map_entry)fieldr   r   r   _IsMapEntry   s
   
r*   c                   @   st   e Zd ZdZ					dddZdd Zdd	 Zd
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 )r   z)JSON format printer for protocol message.FNc                 C   s6   || _ || _|| _|| _|rd|| _d S d | _d S )Nz.{}g)r   r   r   r    formatfloat_format)selfr   r   r   r    r   r   r   r   __init__   s   
z_Printer.__init__c                 C   s   |  |}tj|||dS )N)r   r   )r#   jsondumps)r-   r   r   r   jsr   r   r   r      s   
z_Printer.ToJsonStringc                 C   sL   |j }|j}t|r| |S |tv rtt| d || S i }| ||S )zEConverts message to an object according to Proto3 JSON Specification.r   )
DESCRIPTOR	full_name_IsWrapperMessage_WrapperMessageToJsonObject_WKTJSONMETHODSr   _RegularMessageToJsonObject)r-   r   message_descriptorr3   r1   r   r   r   r#      s   
z_Printer._MessageToJsonObjectc              
      s  |  }z|D ]l\ }jr j}n j}t rF jjd }i }|D ]}t|tr2|r/d}	nd}	nt	|}	
||| ||	< q#|||< q jtjjkrZ fdd|D ||< q jrkd j }
 |||< q
 |||< qjr|j}
|
jD ]D  jtjjkr jtjjks jrq}jr j}n j}||v rq}t ri ||< q} jtjjkrg ||< q}
  j||< q}W |S W |S  ty } z	td j|d}~ww )	z?Converts normal message according to Proto3 JSON Specification.valuetruefalsec                    s   g | ]}  |qS r   )_FieldToJsonObject).0kr)   r-   r   r   
<listcomp>   s    z8_Printer._RegularMessageToJsonObject.<locals>.<listcomp>z[%s]z#Failed to serialize {0} field: {1}.N)
ListFieldsr   name	json_namer*   r(   fields_by_name
isinstanceboolstrr<   labelr   r'   LABEL_REPEATEDis_extensionr3   r   r2   fieldscpp_typeCPPTYPE_MESSAGEcontaining_oneofdefault_value
ValueErrorr   r+   )r-   r   r1   rK   r9   rB   Zv_fieldZjs_mapkeyZrecorded_keyr8   er   r?   r   r7      sn   






z$_Printer._RegularMessageToJsonObjectc                 C   s2  |j tjjkr| |S |j tjjkr;| jr|S |jjdkr dS |jj	
|d}|dur/|jS |jjdkr7|S td|j tjjkrS|jtjjkrQt|dS |S |j tjjkr^t|S |j tv rgt|S |j tv rt|ry|dk rwtS tS t|rtS |j tjj kr| j!rt"t#|| j!S t$%|S |S )z<Converts field value according to Proto3 JSON Specification.google.protobuf.NullValueNproto3zKEnum field contains an integer value which can not mapped to an enum value.utf-8g        )&rL   r   r'   rM   r#   CPPTYPE_ENUMr   	enum_typer3   values_by_numbergetrB   filesyntaxr   CPPTYPE_STRINGr&   
TYPE_BYTESbase64	b64encodedecodeCPPTYPE_BOOLrF   _INT64_TYPESrG   _FLOAT_TYPESmathisinf_NEG_INFINITY	_INFINITYisnan_NANCPPTYPE_FLOATr,   floatr+   r   ZToShortestFloat)r-   r)   r9   
enum_valuer   r   r   r<     sB   





z_Printer._FieldToJsonObjectc                 C   s   |  si S t }|j}||d< t|| j}||j |j}|j}t	|r/| 
||d< |S |tv rBtt| d || |d< |S | ||S )z<Converts Any message according to Proto3 JSON Specification.@typer9   r   )rA   r   type_url_CreateMessageFromTypeUrlr    ZParseFromStringr9   r2   r3   r4   r5   r6   r   r7   )r-   r   r1   rn   sub_messager8   r3   r   r   r   _AnyMessageToJsonObject;  s(   z _Printer._AnyMessageToJsonObjectc                 C   s   |  S )z8Converts message according to Proto3 JSON Specification.)r   r-   r   r   r   r   _GenericMessageToJsonObjectP  s   z$_Printer._GenericMessageToJsonObjectc                 C   sd   | d}|du s|dkrdS |dkr| |jS |dkr!|j}nt||}|jj| }| ||S )z>Converts Value message according to Proto3 JSON Specification.kindN
null_value
list_valuestruct_value)Z
WhichOneof_ListValueMessageToJsonObjectrv   rw   getattrr2   rD   r<   )r-   r   whichr9   Zoneof_descriptorr   r   r   _ValueMessageToJsonObjectV  s   

z"_Printer._ValueMessageToJsonObjectc                    s    fdd|j D S )zBConverts ListValue message according to Proto3 JSON Specification.c                    s   g | ]}  |qS r   )r{   )r=   r9   r-   r   r   r@   h  s    z:_Printer._ListValueMessageToJsonObject.<locals>.<listcomp>)valuesrr   r   r|   r   rx   f  s   
z&_Printer._ListValueMessageToJsonObjectc                 C   s*   |j }i }|D ]}| || ||< q|S )z?Converts Struct message according to Proto3 JSON Specification.)rK   r{   )r-   r   rK   retrQ   r   r   r   _StructMessageToJsonObjectk  s
   z#_Printer._StructMessageToJsonObjectc                 C   s   |  |jjd |jS )Nr9   )r<   r2   rD   r9   rr   r   r   r   r5   s  s   z$_Printer._WrapperMessageToJsonObjectFFFNN)r   r   r   r   r.   r   r#   r7   r<   rq   rs   r{   rx   r   r5   r   r   r   r   r      s$    
@+r   c                 C   s   | j jdkS )Nzgoogle/protobuf/wrappers.proto)rZ   rB   )r8   r   r   r   r4   x  s   r4   c                 C   s4   i }| D ]\}}||v rt d||||< q|S )Nz'Failed to load JSON: duplicate key {0}.)r   r+   )r1   resultrB   r9   r   r   r   _DuplicateChecker|  s   
r   c                 C   sd   t  }|du r|jn|}| dd }z||}W n ty)   td| w ||}| S )z"Creates a message from a type URL.N/z1Can not find message descriptor by type_url: {0}.)	r   ZDefaultpoolsplitZFindMessageTypeByNameKeyError	TypeErrorr+   ZGetPrototype)rn   r    dbr   	type_namer8   Zmessage_classr   r   r   ro     s   
ro   c              
   C   s`   t | ts
| d} z	tj| td}W n ty( } z	tdt|d}~ww t	||||S )a  Parses a JSON representation of a protocol message into a message.

  Args:
    text: Message JSON representation.
    message: A protocol buffer message to merge into.
    ignore_unknown_fields: If True, do not raise errors for unknown fields.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
        default.

  Returns:
    The same message passed as argument.

  Raises::
    ParseError: On JSON parsing problems.
  rU   )object_pairs_hookzFailed to load JSON: {0}.N)
rE   rG   r`   r/   loadsr   rP   r   r+   	ParseDict)textr   ignore_unknown_fieldsr    r1   rR   r   r   r   Parse  s   

r   c                 C   s   t ||}|| | |S )a  Parses a JSON dictionary representation into a message.

  Args:
    js_dict: Dict representation of a JSON message.
    message: A protocol buffer message to merge into.
    ignore_unknown_fields: If True, do not raise errors for unknown fields.
    descriptor_pool: A Descriptor Pool for resolving types. If None use the
      default.

  Returns:
    The same message passed as argument.
  )_ParserConvertMessage)Zjs_dictr   r   r    parserr   r   r   r     s   
r   c                   @   s`   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d Zdd Zdd ZdS )r   z(JSON format parser for protocol message.c                 C   s   || _ || _d S r%   )r   r    )r-   r   r    r   r   r   r.     s   
z_Parser.__init__c                 C   sX   |j }|j}t|r| || dS |tv r$tt| d |||  dS | || dS )zConvert a JSON object into a message.

    Args:
      value: A JSON object.
      message: A WKT or regular protocol message to record the data.

    Raises:
      ParseError: In case of convert problems.
       N)r2   r3   r4   _ConvertWrapperMessager6   r   _ConvertFieldValuePair)r-   r9   r   r8   r3   r   r   r   r     s   
z_Parser.ConvertMessagec                 C   s  g }|j }tdd |jD }|D ]}zz||d}|s%|j|d}|sWt|rW|js7td	|j
|dd }|j|}|sWd|ddd }|j|}|sn| jr^W qtd	|j
|d	d
 |jD ||v r|td	|j j
||| || }	|jdur|	dur|jj}
|
|v rtd	|j j
|
||
 |	du r|jtjjkr|jj
dkrt||j}d|_n|jtjjkr|jj
dkrt||jd n||j W qt|r||j | |	|| n|j tjj!krT||j t"|	t#std	||	|jtjjkr8|	D ]!}t||j$ }|du r/|j j
dkr/td| %|| qnV|	D ]}|du rEtdt||jt&|| q:n:|jtjjkrw|j'rf|j| }nt||j}|(  | %|	| n|j'rt&|	||j|< n
t||jt&|	| W q ty } z|r|jdu rtd	||tt)|d}~w t*y } ztd	||d}~w t+y } ztd	||d}~ww dS )zConvert field value pairs into regular message.

    Args:
      js: A JSON object to convert the field value pairs.
      message: A regular protocol message to record the data.

    Raises:
      ParseError: In case of problems converting.
    c                 s   s    | ]}|j |fV  qd S r%   rC   r=   fr   r   r   	<genexpr>  s    z1_Parser._ConvertFieldValuePair.<locals>.<genexpr>Nz)Message type {0} does not have extensionsr   r   .zVMessage type "{0}" has no field named "{1}".
 Available Fields(except extensions): {2}c                 S   s   g | ]}|j qS r   r   r   r   r   r   r@     s    z2_Parser._ConvertFieldValuePair.<locals>.<listcomp>z9Message type "{0}" should not have multiple "{1}" fields.z?Message type "{0}" should not have multiple "{1}" oneof fields.google.protobuf.Valuer   rS   z.repeated field {0} must be in [] which is {1}.zAnull is not allowed to be used as an element in a repeated field.zFailed to parse {0} field: {1}.),r2   dictrK   rY   rD   _VALID_EXTENSION_NAMEmatchZis_extendabler   r+   r3   Z
ExtensionsZ_FindExtensionByNamejoinr   r   appendrN   rB   rL   r   r'   rM   r(   ry   ru   rV   rW   setattr
ClearFieldr*   _ConvertMapFieldValuerH   rI   rE   listaddr   _ConvertScalarFieldValuerJ   ZSetInParentrG   rP   r   )r-   r1   r   namesr8   Zfields_by_json_namerB   r)   
identifierr9   Z
oneof_namerp   itemrR   r   r   r   r     s   






z_Parser._ConvertFieldValuePairc                 C   s   t |tr	|s	dS z|d }W n ty   tdw t|| j}|j}|j}t|r4| 	|d | n |t
v rGtt
| d |d ||  n|d= | || ||d< | |_||_dS )z/Convert a JSON representation into Any message.Nrm   z*@type is missing when parsing any message.r9   r   )rE   r   r   r   ro   r    r2   r3   r4   r   r6   r   r   ZSerializeToStringr9   rn   )r-   r9   r   rn   rp   r8   r3   r   r   r   _ConvertAnyMessageT  s.   

z_Parser._ConvertAnyMessagec              
   C   s2   z| | W dS  ty } zt|d}~ww )z?Convert a JSON representation into message with FromJsonString.N)ZFromJsonStringrP   r   )r-   r9   r   rR   r   r   r   _ConvertGenericMessagem  s   z_Parser._ConvertGenericMessagec                 C   s   t |tr| ||j dS t |tr| ||j dS |du r%d|_dS t |tr/||_	dS t |t
r9||_dS t |trC||_dS td|t|)z1Convert a JSON representation into Value message.Nr   z"Value {0} has unexpected type {1}.)rE   r   _ConvertStructMessagerw   r   _ConvertListValueMessagerv   ru   rF   Z
bool_valuerG   Zstring_value_INT_OR_FLOATZnumber_valuer   r+   r&   )r-   r9   r   r   r   r   _ConvertValueMessagev  s   








z_Parser._ConvertValueMessagec                 C   sB   t |tstd||d |D ]}| ||j  qdS )z5Convert a JSON representation into ListValue message.z%ListValue must be in [] which is {0}.r}   N)rE   r   r   r+   r   r   r}   r   )r-   r9   r   r   r   r   r   r     s   

z _Parser._ConvertListValueMessagec                 C   sD   t |tstd||  |D ]}| || |j|  qdS )z2Convert a JSON representation into Struct message.z&Struct must be in a dict which is {0}.N)rE   r   r   r+   ZClearr   rK   )r-   r9   r   rQ   r   r   r   r     s   
z_Parser._ConvertStructMessagec                 C   s"   |j jd }t|dt|| dS )z3Convert a JSON representation into Wrapper message.r9   N)r2   rD   r   r   )r-   r9   r   r)   r   r   r   r     s   z_Parser._ConvertWrapperMessagec                 C   s   t |tstd|j||jjd }|jjd }|D ]+}t||d}|jt	j
jkr:| || t||j|  qt|| |t||j|< qdS )a5  Convert map field value for a message map field.

    Args:
      value: A JSON object to convert the map field value.
      message: A protocol message to record the converted data.
      field: The descriptor of the map field to be converted.

    Raises:
      ParseError: In case of convert problems.
    z-Map field {0} must be in a dict which is {1}.rQ   r9   TN)rE   r   r   r+   rB   r(   rD   r   rL   r   r'   rM   r   ry   )r-   r9   r   r)   Z	key_fieldZvalue_fieldrQ   	key_valuer   r   r   r     s(   
z_Parser._ConvertMapFieldValueN)r   r   r   r   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    v		r   c                 C   sH  |j tv r	t| S |j tv rt| |S |j tjjkrt| |S |j tjj	krV|j
tjjkrKt| tr8| d}n| }|ddt|d    }t|S t| rTtd| S |j tjjkr|jj| d}|du rzt| }|jj|d}W n ty   td| |jjw |du r|jjdkr|S td| |jj|j S dS )aB  Convert a single scalar field value.

  Args:
    value: A scalar value to convert the scalar field value.
    field: The descriptor of the field to convert.
    require_str: If True, the field value must be a str.

  Returns:
    The converted scalar field value

  Raises:
    ParseError: In case of convert problems.
  rU      =   zUnpaired surrogateNz)Invalid enum value {0} for enum type {1}.rT   )!rL   
_INT_TYPES_ConvertIntegerrc   _ConvertFloatr   r'   ra   _ConvertBoolr\   r&   r]   rE   rG   encodelenr^   urlsafe_b64decode_UNPAIRED_SURROGATE_PATTERNsearchr   rV   rW   Zvalues_by_namerY   intrX   rP   r+   r3   rZ   r[   number)r9   r)   require_strencodedZpadded_valuerl   r   r   r   r   r     sF   






r   c                 C   sf   t | tr|  std| t | tr#| ddkr#td| t | tr/td| t| S )zConvert an integer.

  Args:
    value: A scalar value to convert.

  Returns:
    The integer value.

  Raises:
    ParseError: If an integer couldn't be consumed.
  zCouldn't parse integer: {0}. r   zCouldn't parse integer: "{0}".z3Bool value {0} is not acceptable for integer field.)	rE   rk   
is_integerr   r+   rG   findrF   r   )r9   r   r   r   r     s   
r   c                 C   s   t | tr8t| rtdt| r| dkrtdtd|jtjj	kr8| t
jkr/td| t
jk r8td| dkr@tdzt| W S  tyq   | tkrVtd	 Y S | tkr`td
 Y S | tkrjtd Y S td| w )z!Convert an floating point number.z-Couldn't parse NaN, use quoted "NaN" instead.r   zJCouldn't parse Infinity or value too large, use quoted "Infinity" instead.zLCouldn't parse -Infinity or value too small, use quoted "-Infinity" instead.zFloat value too largezFloat value too smallnanz.Couldn't parse float "nan", use "NaN" instead.z-infinfzCouldn't parse float: {0}.)rE   rk   rd   rh   r   re   rL   r   r'   rj   r   Z
_FLOAT_MAXZ
_FLOAT_MINrP   rf   rg   ri   r+   )r9   r)   r   r   r   r     s2   





r   c                 C   s@   |r| dkrdS | dkrdS t d| t| tst d| S )zConvert a boolean value.

  Args:
    value: A scalar value to convert.
    require_str: If True, value must be a str.

  Returns:
    The bool parsed.

  Raises:
    ParseError: If a boolean value couldn't be consumed.
  r:   Tr;   Fz$Expected "true" or "false", not {0}.z&Expected true or false without quotes.)r   r+   rE   rF   )r9   r   r   r   r   r   0  s   
r   rq   r   rs   r   rx   r   r   r   r{   r   )zgoogle.protobuf.Anyzgoogle.protobuf.Durationzgoogle.protobuf.FieldMaskzgoogle.protobuf.ListValuezgoogle.protobuf.Structzgoogle.protobuf.Timestampr   )FFr   FFNNr   )FN)F)9r   
__author__r^   collectionsr   r/   rd   operatorr   resysZgoogle.protobuf.internalr   Zgoogle.protobufr   r   Z_TIMESTAMPFOMAT	frozensetr'   ZCPPTYPE_INT32ZCPPTYPE_UINT32ZCPPTYPE_INT64ZCPPTYPE_UINT64r   rb   rj   ZCPPTYPE_DOUBLErc   rg   rf   ri   compiler   r   	Exceptionr
   r   r   r"   r$   r*   objectr   r4   r   ro   r   r   r   rk   r   r   r   r   r   r   r6   r   r   r   r   <module>   s   

*
& K	

 
z6$
