
                            d Z ddlm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d	lmZ dd
lmZ ddlmZ 	 	 	 	 ddZ G d de      Zy)z,Provides a parser for --container arguments.    )annotationsN)Sequence)Any)base)cli)parser_arguments)parser_errors)parser_extensionsflagsc                    t        j                         j                  |        |j                  |        t        | j                  |      }|j
                  | j                  _        y)zAddContainerFlags updates parser to add --container arg parsing.

  Args:
    parser: The parser to patch.
    container_arg_group: Arguments that can be specified per-container.
  N)r   ContainerFlagAddToParserContainerParserparserParseKnownArgsparse_known_args)r   container_arg_groupcontainer_parsers      6lib/googlecloudsdk/command_lib/run/container_parser.pyAddContainerFlagsr      sM     ##F+!!&)$V]]4GH#3#B#B&--     c                  T    e Zd ZdZdZdZ	 	 	 	 d
dZddZddZddZ		 	 	 	 	 	 ddZ
y	)r   zIContainerParser adds custom container parsing behavior to ArgumentParser.z--containerz--presetc                x    |j                   | _        |j                  | _        |j                  | _        || _        y)zContainerParser constructor.

    Args:
      parser: The original command's parser. Used to parse non-container args.
      container_arg_group: Arguments to add to per-container parsers.
    N)r   _parse_known_argsprog_prog_calliope_command_container_arg_group)selfr   r   s      r   __init__zContainerParser.__init__5   s3     $44DDJ#55D 3Dr   c                   | j                   g}g }|rd|j                         }t        |t        j                        r|j                  |j                         n|j                  |j                         |rdt        |      S )zE_GetContainerFlags returns the configured set of per-container flags.)
r   pop
isinstancecalliope_baseArgumentGroupextend	argumentsappendname	frozenset)r    args
flag_namesargs       r   _GetContainerFlagsz"ContainerParser._GetContainerFlagsE   sg    %%&DJ
HHJc	C44	5CMM"#((#  Z  r   c                   t        j                  d| j                  | j                        }t	        j
                  |ddd      }| j                  j                  |       t        j                  j                  |       |S )zD_NewContainerParser creates a new parser for parsing container args.F)add_helpr   calliope_commandNT)r   	is_globalcli_generatorallow_positional)
r
   ArgumentParserr   r   r   ArgumentInterceptorr   r   r   FLAG_INTERNAL_FLAG_FILE_LINE)r    r   ais      r   _NewContainerParserz#ContainerParser._NewContainerParserQ   sr    --ZZ//F 
	-	-	
B 	))"-$$004Mr   c                    | j                         j                  |j                               }|r&t        j                  ddj                  |            y)z_CheckForContainerFlags checks that no container flags were specified.

    Args:
      namespace: The namespace to check.
    zJWhen --container is specified {flags} must be specified after --container.z, r   N)r/   intersectionGetSpecifiedArgNamesr	   ArgumentErrorjoin)r    	namespacecontainer_flagss      r   _CheckForContainerFlagsz'ContainerParser._CheckForContainerFlagsd   sW     --/<<&&(O ''		/*  r   c                   g }t        j                  t              }|}d}|t        |      k  r||   }|dz  }|| j                  k(  r0|t        |      k\  r|j                  |       n|||      }|dz  }nt        |t              r9|j                  | j                  dz         r||j                  dd      d      }nTt        |t              rq|j                  | j                  dz         rS|j                  dd      d   }|j                  d      d   }	|	t        j                  v r||	   }|j                  |       nt        |t              r|j                  | j                        rl|t        |      k  r^||   }|j                  d      d   }	|	t        j                  v r-|||      }|j                  |       |j                  ||          |dz  }n<|dk(  r&|j                  |       |j                  ||d        n!|j                  |       |t        |      k  r|s| j                  ||      S i |_        | j                  |j                   d	<   |j#                         D ]I  \  }
}t%        j&                         }| j)                         j+                  ||      }||j                  |
<   K | j                  ||      \  }}| j-                  |       ||fS )
aH  Performs custom --container arg parsing.

    Groups arguments after each --container flag to be parsed into that
    container's namespace. For each container a new parser is used to parse that
    container's flags into fresh namespace and those namespaces are stored as a
    dict in namespace.containers. Remaining args are parsed by the orignal
    parser's parse_known_args method.

    Args:
      args: The arguments to parse.
      namespace: The namespace to store parsed args in.

    Returns:
      A tuple containing the updated namespace and a list of unknown args.
    r      =)sepmaxsplit:z--N)r,   r@   
containers)collectionsdefaultdictlistlen_CONTAINER_FLAG_NAMEr)   r$   str
startswithsplit_PRESET_FLAG_NAMEr   INGRESS_CONTAINER_PRESETSr'   r   rI   _specified_argsitemsr
   	Namespacer:   
parse_argsrB   )r    r,   r@   	remainingrI   currentivalue
preset_argpreset_namecontainer_namecontainer_argscontainer_namespaceunknown_argss                 r   r   zContainerParser.ParseKnownArgst   s   ( I((.JG	A
c$i-1ge1fa	$++	+D	>


5
!tAw''
q&!eS!e&6&6

#
#c
)' U[[S1[=a@A UC
 t55;<[[S1[5a8
 &&s+A.%999{+' UC
 t556#d)m!W
 &&s+A.%999tAw''


5
!


47
#	QD=ab"u[ c$i-^ ##i#HHI.2.G.GIl+*4*:*:*<&-779 446AA)< B  .Ai>* += #44) 5 I| 	  +l""r   N)r    parser_extensions.ArgumentParserr   calliope_base.ArgumentGroup)returnzfrozenset[str])rd   rb   )r@   parser_extensions.Namespace)r,   zSequence[Any]r@   re   rd   z1tuple[parser_extensions.Namespace, Sequence[Any]])__name__
__module____qualname____doc__rN   rR   r!   r/   r:   rB   r    r   r   r   r   /   s\    Q& 4.4 74 
!& X#X# -X# 9	X#r   r   )r   z$parser_arguments.ArgumentInterceptorr   rc   )ri   
__future__r   rJ   collections.abcr   typingr   googlecloudsdk.callioper   r%   r   r   r	   r
   googlecloudsdk.command_lib.runr   r   objectr   rj   r   r   <module>rq      sN    3 "  $  9 ' 4 1 5 0C0C4C ]#f ]#r   