
                            d Z ddlmZ ddlmZ ddlmZ ddlZddlmZ ddlm	Z	 ddl
Z
ej                  Zej                  Zej                  Zej                  Zej                  Zej                   Zej"                  Zej$                  Zej&                  ZdZej*                  Zej,                  Zej.                  Zej0                  Zej2                  Z G d	 d
ej4                        Z G d de      Z G d de      Zy)zA basic command line parser.

This command line parser does the bare minimum required to understand the
commands and flags being used as well as perform completion. This is not a
replacement for argparse (yet).
    )absolute_import)division)unicode_literalsN)cli_tree)lexerzinteractive.is_specialc                   ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
ArgTokenTyper                        N)__name__
__module____qualname__UNKNOWNPREFIXGROUPCOMMANDFLAGFLAG_ARG
POSITIONALSPECIAL     4lib/googlecloudsdk/command_lib/interactive/parser.pyr	   r	   5   s*    '&
%'	
$(*'r   r	   c                   @    e Zd ZdZej
                  dddfdZd Zd Zy)ArgTokena#  Shell token info.

  Attributes:
    value: A string associated with the token.
    token_type: Instance of ArgTokenType
    tree: A subtree of CLI root.
    start: The index of the first char in the original string.
    end: The index directly after the last char in the original string.
  Nc                 J    || _         || _        || _        || _        || _        y N)value
token_typetreestartend)selfr#   r$   r%   r&   r'   s         r   __init__zArgToken.__init__K   s%    DJ DODIDJDHr   c                 b    t        || j                        r| j                  |j                  k(  S y)zEquality based on properties.F)
isinstance	__class____dict__)r(   others     r   __eq__zArgToken.__eq__S   s&    %(]]enn,,r   c                 z    dj                  | j                  | j                  | j                  | j                        S )zImprove debugging during tests.zArgToken({}, {}, {}, {}))formatr#   r$   r&   r'   )r(   s    r   __repr__zArgToken.__repr__Y   s0    %,,TZZ-1ZZC Cr   )	r   r   r   __doc__r	   r   r)   r/   r2   r   r   r   r    r    @   s)     (4';';$tCr   r    c                   ,    e Zd ZdZddZddZd Zd Zy)	ParserzShell command line parser.

  Attributes:
    args:
    context:
    cmd:
    hidden:
    positionals_seen:
    root:
    statement:
    tokens:
  Nc                     || _         || _        g | _        | j                   | _        d| _        d | _        d| _        d | _        | j                  |       y )Nr   )	roothiddenargscmdpositionals_seenprevious_line	statementtokens
SetContext)r(   r7   contextr8   s       r   r)   zParser.__init__m   sL    DIDKDIyyDHDDDNDKOOGr   c                 @    t        j                  |xs d      | _        y)z(Sets the default command prompt context. N)six	text_typer@   )r(   r@   s     r   r?   zParser.SetContextz   s    ==B/DLr   c           	      	   t        j                  |      | _        | j                  | _        d| _        g | _        d}| j                  r1| j                  j                  d      }|j                         }|j                  t         j                  j                  k(  rid}| j                  | _        | j                  j                  t        |t        j                  | j                  |j                   |j"                               nh|j                  t         j                  j$                  k(  r| j'                  ||       n-|j                  t         j                  j(                  k(  r|s|| j                  t*           v r| j                  t*           |   | _        | j                  t,           rt        j.                  }nDt0        | j                  v r"t        j                  }| j                  | _        nt        j2                  }| j                  j                  t        ||| j                  |j                   |j"                               n"| j                  | j                  k(  rmd|v rit        j                  }| j                  | _        | j                  j                  t        ||| j                  |j                   |j"                               n| j
                  t5        | j                  t6                 k  r| j                  t6           | j
                     }| j                  j                  t        |t        j8                  ||j                   |j"                               |t:           dvr| xj
                  dz  c_        n|s	 | j                  S d}| j                  | j                  k(  rt        j<                  }nt        j>                  }| j                  j                  t        ||| j                  |j                   |j"                               nVd}| j                  j                  t        |t        j>                  | j                  |j                   |j"                               | j                  r1| j                  S )a  Parses the next command from line and returns a list of ArgTokens.

    The parse stops at the first token that is not an ARG or FLAG. That token is
    not consumed. The caller can examine the return value to determine the
    parts of the line that were ignored and the remainder of the line that was
    not lexed/parsed yet.

    Args:
      line: a string containing the current command line

    Returns:
      A list of ArgTokens.
    r   F=)*+r
   T) r   GetShellTokensr>   r7   r:   r;   r9   popUnquotedValuelexShellTokenType
TERMINATORappendr    r	   r   r&   r'   r   	ParseFlagARGLOOKUP_COMMANDSLOOKUP_IS_GROUPr   LOOKUP_IS_SPECIALr   lenLOOKUP_POSITIONALSr   LOOKUP_NARGSr   r   )r(   lineunknowntokenr#   r$   
positionals          r   ParseCommandzParser.ParseCommand~   sB    &&t,DKyyDHDDIG
++kkooa e!!#e	e**55	599		%)=)=txx"'++uyy: 	; 99,,111ue$99,,000DHH_--XXo.u5$(XXo&%++J DHH,%--JyyDH%--J
))

8E:txx$)KK< = XX"se|#++*YY$(
))

8E:txx$)KK< = ""S2D)E%FFxx 23D4I4IJ*
))

8E<+B+B$.UYYH I%Z7!!Q&!
  99 'XX"%,,J%--J
))

8E:txx$)KK< = 		%)=)=txx"'++uyy: 	;k ++p 99r   c           	      h   |j                   }|j                  }d}d}d}d|v r6|j                  dd      \  }}|t        |      z   }|dz   }|t        |      z   }| j                  t
           j                  |      }|r| j                  s^|t           rU| j                  j                  t        |t        j                  | j                  |j                   |j                               y|t           dk7  rQ|O| j                  rC| j                  j!                  d      }|j#                         }|j                   }|j                  }| j                  j                  t        |t        j$                  |||             |7| j                  j                  t        |t        j&                  d||             yy)z5Parses the flag token and appends it to the arg list.NrF   r
   boolr   )r&   r'   splitrU   r:   LOOKUP_FLAGSgetr8   LOOKUP_IS_HIDDENr9   rO   r    r	   r   LOOKUP_TYPEr>   rJ   rK   r   r   )	r(   rZ   name
name_startname_endr#   value_start	value_endflags	            r   rP   zParser.ParseFlag   sp    JyyHEKI
d{JJsA&kdEc$i'hqLkE
*i88L!%%d+Dt{{t,<'=
iixl&:&:DHH %UYY8 9KF"u}kkooa e!!#eKKk))iIIXdL$5$5t((4 5
iix|'<'<d +Y8 9 r   )NFr"   )r   r   r   r3   r)   r?   r\   rP   r   r   r   r5   r5   _   s    0M^!9r   r5   )r3   
__future__r   r   r   enumgooglecloudsdk.callioper   &googlecloudsdk.command_lib.interactiver   rC   LOOKUP_ATTRrR   LOOKUP_CHOICESLOOKUP_HIDDEN_CHOICESLOOKUP_COMPLETERr`   LOOKUP_GROUPSrS   rb   rT   LOOKUP_NAMErW   rV   rc   LOOKUP_CLI_VERSIONEnumr	   objectr    r5   r   r   r   <module>rw      s     '  '  , 8 
 ""**(( 66 ,, $$&&**,, , ""$$00 ""00 499 Cv C>O9V O9r   