
    q                        d Z ddlmZ ddlmZ ddlmZ ddl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	l
mZ ddlmZ d
Zej$                  j'                  ej$                  j)                  e      d      Z ej.                  e      ZdZ G d dej4                        Z G d dej4                        Zd Zd Z G d de      Z y)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                       e Zd ZdZy)MessageParsingErrorzDError Raised if there is a problem converting to/from OutputMessage.N__name__
__module____qualname____doc__     Alib/googlecloudsdk/command_lib/util/anthos/structured_messages.pyr   r   +   s    Lr   r   c                       e Zd ZdZy)InvalidMessageErrorzCError Raised if there an input string is not a valid OutputMessage.Nr   r   r   r   r   r   /   s    Kr   r   c                     t        j                  |       xs) t        j                  |       xr t        d | D              S )zGReturn True if item is a dict like object or list of dict like objects.c              3   F   K   | ]  }t        j                  |        y wN)r   	dict_like).0xs     r   	<genexpr>z!IsResourceLike.<locals>.<genexpr>6   s     %FAdnnQ&7s   !)r   r   	list_likeall)items    r   IsResourceLiker    3   s9    		 
H$.."6 #G"%%F%F"FHr   c                    	 t        j                  |       }t        j                  |       t	        j
                  |d          |j                  d      }|rt        |      st        t              |S # t         j                  t        f$ r }t        dj                  | |            d}~wt        j                  t        j                   j"                  f$ r }t%        dj                  | |            d}~ww xY w)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   ParseAndValidateMessager6   9   s    K))I&KK({;/00I	2233


z	* G
077	1EG G

(
(%++*E*E	F K
3::9bIK KKs$   A0A3 3C7B''0C7C22C7c                       e Zd ZdZdeddddfdZ G d de      Zed        Z	ed        Z
ed	        Zed
        Zed        Zed        Zd Zd Zd Zd Zd Zd Zedd       Zy)OutputMessagea.  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                    |s|r|s|s |s|st        dj                  |||            || _        |rt        |      st	        t
              || _        |r]t        |t              st        dj                  |            | j                  |j                  d      |j                  d      ||      }nd }|| _        || _        || _        || _        || _        y )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:[{}]r/   context)r   r,   _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__zOutputMessage.__init__[   s     -]-3 6$}5	7 7 DJ^M:233'Dt,!5<<]KM 	Mm//8+//	:%#%c
 cDIDMDHDMDKr   c                   :    e Zd ZdZdZdZd
dZd Zd Zd Z	dd	Z
y)OutputMessage.ErrorDetailsz(Data class for ErrorDetail sub-messages.z
[{error}].z  Additional details: [{context}]Nc                 d    || _         || _        || _        || _        | j                  sd| _        y y )Nr/   )r/   r:   rI   rJ   )rE   	error_msgr:   rI   rJ   s        r   rL   z#OutputMessage.ErrorDetails.__init__   s1    djdldldjZZ
 r   c                 |    t        j                  | j                        }| j                  r| j                  |d<   |S )N)r/   r:   )collectionsOrderedDictr/   r:   rE   outs     r   AsDictz!OutputMessage.ErrorDetails.AsDict   s/    ##$**5c	Ijr   c                     | j                   r#t        j                  | j                               S t	        j
                  | j                         d      S )NT)
round_trip)rI   jsondumpsrV   r   dumprE   s    r   __str__z"OutputMessage.ErrorDetails.__str__   s5    	zz$++-((YYt{{}66r   c                     t        |t        j                        sy| j                  |j                  k(  xr | j                  |j                  k(  S NF)r=   r8   r?   r/   r:   rE   others     r   __eq__z!OutputMessage.ErrorDetails.__eq__   s:    }99:ZZ5;;&H4<<5==+HHr   c                 
   |xs | j                   }|j                  | j                  | j                  j	                               }| j
                  r1|xs | j                  }|j                  | j
                        }||z  }|S )z%Render formatted ErrorDetails string.)r/   rJ   )r:   )_DEFAULT_ERROR_FORMATr,   r/   rJ   
capitalizer:   _DEFAULT_CONTEXT_FORMAT)rE   error_formatcontext_formatoutput_stringcontext_strings        r   Formatz!OutputMessage.ErrorDetails.Format   s{    "@d&@&@m#**

$**"7"7"9 + ;m	'G4+G+G'..t||.D'r   )NFr/   )NN)r   r   r   r   rd   rf   rL   rV   r]   rb   rk   r   r   r   r?   rN      s+    2(@7
I
	r   r?   c                     | j                   S r   )r;   r\   s    r   rF   zOutputMessage.body   s    ::r   c                     | j                   S r   )r<   r\   s    r   r#   zOutputMessage.resource_body   s    r   c                     | j                   S r   r@   r\   s    r   rH   zOutputMessage.error_details   s    99r   c                     | j                   S r   )rA   r\   s    r   rG   zOutputMessage.version   s    ==r   c                     | j                   S r   )rB   r\   s    r   r"   zOutputMessage.timestamp   s    88Or   c                     | j                   S r   )rD   r\   s    r   rJ   zOutputMessage.level   s    ;;r   c                 P   t        j                  | j                  | j                        }| j                  r| j                  |d<   | j
                  r| j
                  |d<   | j                  r| j                  j                         |d<   | j                  r| j                  |d<   |S )z"Returns a dict for the attributes.)rG   r"   rF   r#   rH   rJ   )	rR   rS   rG   r"   rF   r#   rH   rV   rJ   rT   s     r   rV   zOutputMessage.AsDict   s    

!
!$,,,0NN<CyyIIc&k!//c/!//668c/zzZZc'lJr   c                     | j                   d uS r   ro   r\   s    r   IsErrorzOutputMessage.IsError   s    99D  r   c                 P    | j                         }t        j                  |d      S )NT)	sort_keys)rV   rY   rZ   rE   msgs     r   ToJSONzOutputMessage.ToJSON   s    
++-C::cT**r   c                 L    | j                         }t        j                  |      S r   )rV   r   r[   rx   s     r   ToYAMLzOutputMessage.ToYAML   s    
++-C99S>r   c                 X    | j                   r| j                  n| j                  } |       S r   )rC   rz   r|   )rE   
serializers     r   r]   zOutputMessage.__str__   s     $4;;J<r   c                 .   t        |t              sy| j                  |j                  k(  xrj | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j
                  |j
                  k(  xr | j                  |j                  k(  S r_   )r=   r8   rH   rF   r#   rG   r"   r`   s     r   rb   zOutputMessage.__eq__   s    e]+%"5"55 .II#.%"5"55. LLEMM). NNeoo-	/r   c           
          t        |      } | |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |      S )z/Parse a YAML/JSON string into an OutputMessage.rF   r#   rH   rG   r"   rJ   )rF   r#   rH   rG   r"   rJ   rI   )r6   r(   )clsr1   rI   yaml_msgs       r   
FromStringzOutputMessage.FromString   se     'y1HHLL(%\\/:%\\/:||I.!k2\\'*   r   )F)r   r   r   r   SCHEMA_VERSIONrL   objectr?   propertyrF   r#   rH   rG   r"   rJ   rV   ru   rz   r|   r]   rb   classmethodr   r   r   r   r8   r8   L   s      %!!#J'V 'R            !+/ 
  
 r   r8   )!r   
__future__r   r   r   rR   rY   osgooglecloudsdk.command_lib.utilr   googlecloudsdk.corer   core_exceptionsr   r	   ruamel.yamlr.   r   pathjoindirname__file___SCHEMA_PATH	Validatorr%   r*   Errorr   r   r    r6   r   r8   r   r   r   <module>r      s    P &  '   	 6 = $ .  RWW__X6<>))),7 O M/// ML/// LHK&f F f r   