
                            S r SSKJr  SSKJr  SSKJr  SSKrSSKJr  SSKJ	r	  SSK
r
\R                  r\R                  r\R                  r\R                  r\R                  r\R                   r\R"                  r\R$                  r\R&                  rSr\R*                  r\R,                  r\R.                  r\R0                  r\R2                  r " S	 S
\R4                  5      r " S S\5      r " S S\5      rg)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                   4    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rg)ArgTokenType5   r                         N)__name__
__module____qualname____firstlineno__UNKNOWNPREFIXGROUPCOMMANDFLAGFLAG_ARG
POSITIONALSPECIAL__static_attributes__r       4lib/googlecloudsdk/command_lib/interactive/parser.pyr	   r	   5   s*    '&
%'	
$(*'r    r	   c                   J    \ rS rSrSr\R                  SSS4S jrS rS r	Sr
g)ArgToken@   a  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                 @    Xl         X l        X0l        X@l        XPl        g N)value
token_typetreestartend)selfr'   r(   r)   r*   r+   s         r!   __init__ArgToken.__init__K   s    J OIJHr    c                 j    [        XR                  5      (       a  U R                  UR                  :H  $ g)zEquality based on properties.F)
isinstance	__class____dict__)r,   others     r!   __eq__ArgToken.__eq__S   s'    %((]]enn,,r    c                 z    SR                  U R                  U R                  U R                  U R                  5      $ )zImprove debugging during tests.zArgToken({}, {}, {}, {}))formatr'   r(   r*   r+   )r,   s    r!   __repr__ArgToken.__repr__Y   s0    %,,TZZ-1ZZC Cr    )r+   r*   r(   r)   r'   )r   r   r   r   __doc__r	   r   r-   r4   r8   r   r   r    r!   r#   r#   @   s)     (4';';$tCr    r#   c                   8    \ rS rSrSrS	S jrS
S jrS rS rSr	g)Parser_   zShell command line parser.

Attributes:
  args:
  context:
  cmd:
  hidden:
  positionals_seen:
  root:
  statement:
  tokens:
Nc                     Xl         X0l        / U l        U R                   U l        SU l        S U l        SU l        S U l        U R                  U5        g )Nr   )	roothiddenargscmdpositionals_seenprevious_line	statementtokens
SetContext)r,   r?   contextr@   s       r!   r-   Parser.__init__m   sH    IKDIyyDHDDDNDKOOGr    c                 L    [         R                  " U=(       d    S5      U l        g)z(Sets the default command prompt context. N)six	text_typerH   )r,   rH   s     r!   rG   Parser.SetContextz   s    ==B/DLr    c           	      R	   [         R                  " U5      U l        U R                  U l        SU l        / U l        SnU R                  (       GaN  U R                  R                  S5      nUR                  5       nUR                  [         R                  R                  :X  ai  SnU R                  U l        U R                  R                  [        U[        R                  U R                  UR                   UR"                  5      5        GO~UR                  [         R                  R$                  :X  a  U R'                  X45        GOCUR                  [         R                  R(                  :X  Ga  U(       Gd  X@R                  [*           ;   a  U R                  [*           U   U l        U R                  [,           (       a  [        R.                  nOF[0        U R                  ;   a"  [        R                  nU R                  U l        O[        R2                  nU R                  R                  [        XEU R                  UR                   UR"                  5      5        GO+U R                  U R                  :X  an  SU;   ah  [        R                  nU R                  U l        U R                  R                  [        XEU R                  UR                   UR"                  5      5        GOU R
                  [5        U R                  [6           5      :  a  U R                  [6           U R
                     nU R                  R                  [        U[        R8                  XcR                   UR"                  5      5        U[:           S;  a  U =R
                  S-  sl        OU(       d   U R                  $ SnU R                  U R                  :X  a  [        R<                  nO[        R>                  nU R                  R                  [        XEU R                  UR                   UR"                  5      5        OVSnU R                  R                  [        U[        R>                  U R                  UR                   UR"                  5      5        U R                  (       a  GMN  U R                  $ )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   GetShellTokensrF   r?   rB   rC   rA   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!   ParseCommandParser.ParseCommand~   s;    &&t,DKyyDHDDIG
+++kkooa e!!#e	e**55	599		%)=)=txx"'++uyy: 	; 99,,111u$99,,000HH_--XXo.u5$(XXo&%++J DHH,%--JyyDH%--J
))

8Etxx$)KK< = XX"se|#++*YY$(
))

8Etxx$)KK< = ""S2D)E%FFxx 23D4I4IJ*
))

8E<+B+B$.UYYH I%Z7!!Q&!
  99 'XX"%,,J%--J
))

8Etxx$)KK< = 		%)=)=txx"'++uyy: 	;k +++p 99r    c           	         UR                   nUR                  nSnSnSnSU;   a5  UR                  SS5      u  p%U[        U5      -   nUS-   nU[        U5      -   nU R                  [
           R                  U5      nU(       a  U R                  (       dc  U[           (       aU  U R                  R                  [        U[        R                  U R                  UR                   UR                  5      5        gU[           S:w  aW  UcT  U R                  (       aC  U R                  R!                  S5      nUR#                  5       nUR                   nUR                  nU R                  R                  [        U[        R$                  UX45      5        Ub6  U R                  R                  [        U[        R&                  SXg5      5        gg)z5Parses the flag token and appends it to the arg list.NrP   r   boolr   )r*   r+   splitr_   rB   LOOKUP_FLAGSgetr@   LOOKUP_IS_HIDDENrA   rY   r#   r	   r   LOOKUP_TYPErF   rT   rU   r   r   )	r,   rd   name
name_startname_endr'   value_start	value_endflags	            r!   rZ   Parser.ParseFlag   sj    JyyHEKI
d{JJsA&kd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 +8 9 r    )	rA   rB   rH   r@   rC   rD   r?   rE   rF   )NFr&   )
r   r   r   r   r:   r-   rG   rf   rZ   r   r   r    r!   r<   r<   _   s    0M^!9r    r<   )r:   
__future__r   r   r   enumgooglecloudsdk.callioper   &googlecloudsdk.command_lib.interactiver   rL   LOOKUP_ATTRr\   LOOKUP_CHOICESLOOKUP_HIDDEN_CHOICESLOOKUP_COMPLETERrk   LOOKUP_GROUPSr]   rm   r^   LOOKUP_NAMEra   r`   rn   LOOKUP_CLI_VERSIONEnumr	   objectr#   r<   r   r    r!   <module>r      s     '  '  , 8 
 ""**(( 66 ,, $$&&**,, , ""$$00 ""00 499 Cv C>O9V O9r    