o
    !d                     @   s`   d dl Z d dlmZ d dlZdd Zdd ZG dd deZG d	d
 d
eZG dd deZdS )    N)CustomArgumentc                 C   sN   | du rdS t jt j| }t t jt j|t js%td| |S )z=Asserts that a path is writable and returns the expanded pathNzUnable to write to file: %s)	ospath
expanduser
expandvarsaccessdirnameabspathW_OK
ValueError)r   outfile r   Cusr/lib/python3.10/site-packages/awscli/customizations/arguments.pyresolve_given_outfile_path   s   r   c                 C   s   | d d dk S )z-Returns True if a parsed result is successfulZResponseMetadataZHTTPStatusCodei,  r   )parsed_resultr   r   r   is_parsed_result_successful   s   r   c                       s8   e Zd ZdZddiZ fddZdd Zdd	 Z  ZS )
OverrideRequiredArgsArgumenta  An argument that if specified makes all other arguments not required

    By not required, it refers to not having an error thrown when the
    parser does not find an argument that is required on the command line.
    To obtain this argument's property of ignoring required arguments,
    subclass from this class and fill out the ``ARG_DATA`` parameter as
    described below. Note this class is really only useful for subclassing.
    namezno-required-argsc                    s*   || _ |   tt| jdi | j d S )Nr   )_session_register_argument_actionsuperr   __init__ARG_DATA)selfsession	__class__r   r   r   7   s   z%OverrideRequiredArgsArgument.__init__c                 C   s   | j d| j d S )Nz%before-building-argument-table-parser)r   registeroverride_required_argsr   r   r   r   r   <   s   z6OverrideRequiredArgsArgument._register_argument_actionc                 K   s2   d| j  }||v r| D ]	}d|| _qd S d S )Nz--F)r   keysrequired)r   Zargument_tableargskwargsZname_in_cmdlineZarg_namer   r   r   r   @   s   
z3OverrideRequiredArgsArgument.override_required_args)	__name__
__module____qualname____doc__r   r   r   r   __classcell__r   r   r   r   r   !   s    r   c                       s8   e Zd ZdZ fddZ fddZedd Z  ZS )StatefulArgumentz+An argument that maintains a stateful valuec                    s    t t| j|i | d | _d S N)r   r)   r   _value)r   r"   r#   r   r   r   r   L   s   
zStatefulArgument.__init__c                    s   t t| || || _d S r*   )r   r)   add_to_paramsr+   r   
parametersvaluer   r   r   r,   P   s   
zStatefulArgument.add_to_paramsc                 C      | j S r*   )r+   r   r   r   r   r/   T      zStatefulArgument.value)	r$   r%   r&   r'   r   r,   propertyr/   r(   r   r   r   r   r)   I   s    r)   c                       sL   e Zd ZdZ fddZedd Zedd Z fdd	Zd
d Z	  Z
S )QueryOutFileArgumentz8An argument that write a JMESPath query result to a filec                    sP   || _ || _|| _|| _d|vrd| j |d< tt| j|g|R i | d S )NZ	help_textz=Saves the command output contents of %s to the given filename)r   _query_after_call_event_permqueryr   r3   r   )r   r   r   r7   Zafter_call_eventpermr"   r#   r   r   r   r   \   s   "zQueryOutFileArgument.__init__c                 C   r0   r*   )r4   r   r   r   r   r7   h   r1   zQueryOutFileArgument.queryc                 C   r0   r*   )r6   r   r   r   r   r8   l   r1   zQueryOutFileArgument.permc                    s>   t |}tt| || | jd ur| j| j| j d S d S r*   )	r   r   r3   r,   r/   r   r   r5   
save_queryr-   r   r   r   r,   p   s
   
z"QueryOutFileArgument.add_to_paramsc                 K   sz   t |r;t| j|}t| jd }|du r|d n|| t| j| j	 W d   dS 1 s4w   Y  dS dS )zSaves the result of a JMESPath expression to a file.

        This method only saves the query data if the response code of
        the parsed result is < 300.
        wN )
r   jmespathsearchr7   openr/   writer   chmodr8   )r   parsedr#   contentsfpr   r   r   r9   w   s   
"zQueryOutFileArgument.save_query)r$   r%   r&   r'   r   r2   r7   r8   r,   r9   r(   r   r   r   r   r3   Y   s    

r3   )	r   Zawscli.argumentsr   r<   r   r   r   r)   r3   r   r   r   r   <module>   s   
(