
    [
#gt                         d dl Z d dlZd dlZd dlmZmZmZmZmZ  G d de j                        Z
 G d de j                        Zy)    N)ListOptionalSequenceAnyUnionc                        e Zd ZdZd
 fdZ	 ddej                  dej                  dee	e
e   df   dee	   ddf
d	Z xZS )HelpfulSubparserActionz^Class to either select a unique plugin based on a substring, or identify
    the alternatives.returnNc                 $    t        |   |i | y N)super__init__)selfargskwargs	__class__s      M/home/panchajanya/Development/work/volatility3/volatility3/cli/volargparse.pyr   zHelpfulSubparserAction.__init__   s    $)&)    parser	namespacevaluesoption_stringc                 Z   d}g }||D ]  }|s|}||gz  } | j                   t        j                  k7  rt        || j                   |       | j                  D cg c]	  }||v s| }	}t        |	      dk  r8d| ddj                  | j                         d}
t        j                  | |
      t        |	      dkD  r.d| ddj                  |	       d}
t        j                  | |
      | j                  |	d	      }t        |d
|	d	          |j                  |d       \  }}t        |      j                         D ]  \  }}t        |||        |rSt        |      j                  t        j                  g        t        |t        j                        j                  |       y y c c}w )N    zinvalid choice z (choose from , )zplugin z matches multiple plugins (r   plugin)destargparseSUPPRESSsetattr_name_parser_maplenjoinArgumentErrorparse_known_argsvarsitems
setdefault_UNRECOGNIZED_ARGS_ATTRgetattrextend)r   r   r   r   r   parser_namearg_stringsvaluenamematched_parsersmsgsubnamespacekeys                r   __call__zHelpfulSubparserAction.__call__   s    ""'KE7*K	   99)))Ityy+6 "22
kT6ID
 
 !##K=tyyI^I^?_>``abC((s33!#K=(CDIIoD^C__`aC((s33&&q'9:	8_Q%78 %+$;$;K$N!k|,224JCIsE* 5 O&&x'G'GLIx??@GGT 1
s   	F(%F()r
   Nr   )__name__
__module____qualname____doc__r   r    ArgumentParser	Namespacer   strr   r   r   r6   __classcell__r   s   @r   r	   r	      sm    * (,.U''.U %%.U c8C=$./	.U
  }.U 
.Ur   r	   c                   L     e Zd ZdefdZdej                  deddf fdZ xZ	S )HelpfulArgParserr
   c                 ^   | j                  |      }t        j                  ||      }|d t        j                  d      t        j
                  t        j                  d      t        j                  t        j                  d      i}|j                  |j                        }|.t        j                  dd|j                        |j                  z  }|j                  r!| ddj                  |j                         d}t	        j                  ||      t        |j                  d	            S )
Nzexpected one argumentzexpected at most one argumentzexpected at least one argumentzexpected %s argumentzexpected %s argumentsz (from: r   r   r   )_get_nargs_patternrematchgettextr    OPTIONALONE_OR_MOREgetnargsngettextchoicesr%   r&   r$   group)r   actionarg_strings_patternnargs_patternrE   nargs_errorsr3   s          r   _match_argumentz HelpfulArgParser._match_argumentK   s   //7(;< =goo&=>!!7??3R#S$$goo6V&WL
 ""6<<0C{$$.0G ll#  ~~Xdii&?%@B((55 5;;q>""r   rN   r0   Nc                 F    t        |t              st        |   ||       y)a_  This is called to ensure a value is correct/valid

        In normal operation, it would check that a value provided is valid and return None
        If it was not valid, it would throw an ArgumentError

        When people provide a partial plugin name, we want to look for a matching plugin name
        which happens in the HelpfulSubparserAction's __call_method

        To get there without tripping the check_value failure, we have to prevent the exception
        being thrown when the value is a HelpfulSubparserAction.  This therefore affects no other
        checks for normal parameters.
        N)
isinstancer	   r   _check_value)r   rN   r0   r   s      r   rU   zHelpfulArgParser._check_valuef   s"     &"89G /r   )
r7   r8   r9   intrR   r    Actionr   rU   r>   r?   s   @r   rA   rA   J   s2    #c #68?? 3 4  r   rA   )r    rF   rD   typingr   r   r   r   r   _SubParsersActionr	   r;   rA    r   r   <module>r[      s=   
   	 7 75UX77 5Up+x.. +r   