
    q                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKJ	r	  SSK
Jr  SSK
Jr  SS	K
Jr  SSKJr  S
r\R$                  R'                  \R$                  R)                  \5      S5      r\R.                  " \5      rSr " S S\R4                  5      r " S S\R4                  5      rS rS r " S S\5      r g)zILibrary for marshalling binary output_messages to/from stdout and stderr.    )absolute_import)division)unicode_literalsN)	time_util)
exceptions)yaml)yaml_validatorz1.0.0zstructured_output_schema.yamlzVResources should be a JSON serializeable object or list of JSON serializeable objects.c                       \ rS rSrSrSrg)MessageParsingError+   zDError Raised if there is a problem converting to/from OutputMessage. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       Alib/googlecloudsdk/command_lib/util/anthos/structured_messages.pyr   r   +   s    Lr   r   c                       \ rS rSrSrSrg)InvalidMessageError/   zCError Raised if there an input string is not a valid OutputMessage.r   Nr   r   r   r   r   r   /   s    Kr   r   c                     [         R                  " U 5      =(       d/    [         R                  " U 5      =(       a    [        S U  5       5      $ )zGReturn True if item is a dict like object or list of dict like objects.c              3   N   #    U  H  n[         R                  " U5      v   M     g 7fN)r   	dict_like).0xs     r   	<genexpr>!IsResourceLike.<locals>.<genexpr>6   s     %FAdnnQ&7&7s   #%)r   r   	list_likeall)items    r   IsResourceLiker%   3   s9    		 
H$.."6 #G"%%F%F"FHr   c                     [         R                  " U 5      n[        R                  U5        [        R
                  " US   5        UR                  S5      nU(       a  [        U5      (       d  [        [        5      eU$ ! [         R                  [        4 a  n[        SR                  X5      5      eSnAf[        R                  [        R                   R"                  4 a  n[%        SR                  X5      5      eSnAff = f)z=Validate that yaml string or object is a valid OutputMessage.	timestampresource_bodyz&Error loading YAML message [{}] :: {}.Nz)Invalid OutputMessage string [{}] :: [{}])r   load_MSG_VALIDATORValidater   Strptimegetr%   
ValueError_INVALID_RESOURCE_VALUE_MSGYAMLParseErrorr   formatr	   ValidationErrorryamlerrorYAMLStreamErrorr   )	input_stryaml_object	resourceseves        r   ParseAndValidateMessager;   9   s    K))I&KK({;/00I	22233


z	* G
077	EG G

(
(%++*E*E	F K
3::9IK KKs$   A<A? ?DB331D$C>>Dc                       \ rS rSrSrS\SSSS4S jr " S S\5      r\	S 5       r
\	S	 5       r\	S
 5       r\	S 5       r\	S 5       r\	S 5       rS rS rS rS rS rS r\SS j5       rSrg)OutputMessageL   a  Class representing a structured output message.

Attributes:
  body: str, message body
  resource_body: Object, YAML/JSON formatted object containing resource output
  error_details: OutputMessage.ErrorDetail, message error details. Only
    present if OutputMessage.isError() == True.
  version: str, message format version
  timestamp: RFC 3339 encoded timestamp
  as_json: bool, if true default string representation of object will be JSON.
   Default is False, which will render this object as YAML.
  level: str, message log level
NFc                    U(       d  U(       a  U(       d  U(       d)  U(       d"  U(       d  [        SR                  X$U5      5      eX l        U(       a  [        U5      (       d  [	        [
        5      eX@l        U(       ab  [        U[        5      (       d  [        SR                  U5      5      eU R                  UR                  S5      UR                  S5      UU5      nOS nXl        X0l        Xl        X`l        Xpl        g )NzInvalid OutputMessage: Must contain one and only one of: body (+resource_body) or error_details: body=[{}], resource_body=[{}], error_details=[{}]z'ErrorDetails must be a dict object:[{}]r4   context)r   r1   _bodyr%   r.   r/   _resource_body
isinstancedictErrorDetailsr-   _err_version_ts_as_json_level)	selfr'   bodyversionr(   error_detailsas_jsonlevelerrs	            r   __init__OutputMessage.__init__[   s     -]-3 6$}5	7 7 J^M::233't,,!5<<]KM 	Mm//8+//	:%#%c
 cIMHMKr   c                   F    \ rS rSrSrSrSrSS jrS rS r	S	 r
SS
 jrSrg)OutputMessage.ErrorDetails   z(Data class for ErrorDetail sub-messages.z
[{error}].z  Additional details: [{context}]Nc                 f    Xl         X l        X0l        X@l        U R                  (       d  SU l        g g )Nr4   )r4   r@   rO   rP   )rK   	error_msgr@   rO   rP   s        r   rR   #OutputMessage.ErrorDetails.__init__   s)    jlljZZ
 r   c                     [         R                  " U R                  S9nU R                  (       a  U R                  US'   U$ )N)r4   r@   )collectionsOrderedDictr4   r@   rK   outs     r   AsDict!OutputMessage.ErrorDetails.AsDict   s/    ##$**5c	Ijr   c                     U R                   (       a$  [        R                  " U R                  5       5      $ [        R
                  " U R                  5       SS9$ )NT)
round_trip)rO   jsondumpsr_   r   dumprK   s    r   __str__"OutputMessage.ErrorDetails.__str__   s5    	zz$++-((YYt{{}66r   c                     [        U[        R                  5      (       d  gU R                  UR                  :H  =(       a    U R                  UR                  :H  $ NF)rC   r=   rE   r4   r@   rK   others     r   __eq__!OutputMessage.ErrorDetails.__eq__   s=    }99::ZZ5;;&H4<<5==+HHr   c                    U=(       d    U R                   nUR                  U R                  U R                  R	                  5       S9nU R
                  (       a2  U=(       d    U R                  nUR                  U R
                  S9nX4-  nU$ )z%Render formatted ErrorDetails string.)r4   rP   )r@   )_DEFAULT_ERROR_FORMATr1   r4   rP   
capitalizer@   _DEFAULT_CONTEXT_FORMAT)rK   error_formatcontext_formatoutput_stringcontext_strings        r   Format!OutputMessage.ErrorDetails.Format   sy    "@d&@&@m#**

$**"7"7"9 + ;m	'G4+G+G'..t||.D'r   )rO   r@   r4   rP   )NFr4   )NN)r   r   r   r   r   rp   rr   rR   r_   rg   rm   rw   r   r   r   r   rE   rU      s+    2(@7
I
	r   rE   c                     U R                   $ r   )rA   rf   s    r   rL   OutputMessage.body   s    ::r   c                     U R                   $ r   )rB   rf   s    r   r(   OutputMessage.resource_body   s    r   c                     U R                   $ r   rF   rf   s    r   rN   OutputMessage.error_details   s    99r   c                     U R                   $ r   )rG   rf   s    r   rM   OutputMessage.version   s    ==r   c                     U R                   $ r   )rH   rf   s    r   r'   OutputMessage.timestamp   s    88Or   c                     U R                   $ r   )rJ   rf   s    r   rP   OutputMessage.level   s    ;;r   c                 t   [         R                  " U R                  U R                  S9nU R                  (       a  U R                  US'   U R
                  (       a  U R
                  US'   U R                  (       a  U R                  R                  5       US'   U R                  (       a  U R                  US'   U$ )z"Returns a dict for the attributes.)rM   r'   rL   r(   rN   rP   )	r[   r\   rM   r'   rL   r(   rN   r_   rP   r]   s     r   r_   OutputMessage.AsDict   s    

!
!$,,,0NN<CyyIIc&k!//c/!//668c/zzZZc'lJr   c                     U R                   S L$ r   r~   rf   s    r   IsErrorOutputMessage.IsError   s    99D  r   c                 L    U R                  5       n[        R                  " USS9$ )NT)	sort_keys)r_   rc   rd   rK   msgs     r   ToJSONOutputMessage.ToJSON   s    
++-C::cT**r   c                 N    U R                  5       n[        R                  " U5      $ r   )r_   r   re   r   s     r   ToYAMLOutputMessage.ToYAML   s    
++-C99S>r   c                 b    U R                   (       a  U R                  OU R                  nU" 5       $ r   )rI   r   r   )rK   
serializers     r   rg   OutputMessage.__str__   s     $4;;J<r   c                 `   [        U[        5      (       d  gU R                  UR                  :H  =(       ay    U R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R
                  UR
                  :H  =(       a    U R                  UR                  :H  $ rj   )rC   r=   rN   rL   r(   rM   r'   rk   s     r   rm   OutputMessage.__eq__   s    e]++%"5"55 .II#.%"5"55. LLEMM). NNeoo-	/r   c           
          [        U5      nU " UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      UR                  S5      US9$ )z/Parse a YAML/JSON string into an OutputMessage.rL   r(   rN   rM   r'   rP   )rL   r(   rN   rM   r'   rP   rO   )r;   r-   )clsr6   rO   yaml_msgs       r   
FromStringOutputMessage.FromString   se     'y1HHLL(%\\/:%\\/:||I.!k2\\'*   r   )rI   rA   rF   rJ   rB   rH   rG   )F)r   r   r   r   r   SCHEMA_VERSIONrR   objectrE   propertyrL   r(   rN   rM   r'   rP   r_   r   r   r   rg   rm   classmethodr   r   r   r   r   r=   r=   L   s      %!!#J'V 'R            !+/ 
  
 r   r=   )!r   
__future__r   r   r   r[   rc   osgooglecloudsdk.command_lib.utilr   googlecloudsdk.corer   core_exceptionsr   r	   ruamel.yamlr3   r   pathjoindirname__file___SCHEMA_PATH	Validatorr*   r/   Errorr   r   r%   r;   r   r=   r   r   r   <module>r      s    P &  '   	 6 = $ .  RWW__X6<>)),7 O M/// ML/// LHK&f F f r   