
    <i                         S r SSKrSSKJrJr  SSKJr  SSKJr  SSK	J
r
  SS	KJr  SS
KJr  SSKJr  \R"                  " SS5      r " S S\5      r " S S\5      rS rg)z?
Validates a user entered pattern against STIXPattern grammar.
    N)CommonTokenStreamParseTreeWalker   )object_validator   )STIXPatternErrorListener)STIXPatternLexer)STIXPatternListener)STIXPatternParser)InspectionListenerQualTypezWITHIN REPEATS STARTSTOPc                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )DuplicateQualifierTypeError   z
Instances represent finding multiple qualifiers of the same type directly
applied to an observation expression (i.e. not on some parenthesized group
of which the observation expression is a member).
c                 V   > SUR                   -   n[        [        U ]  U5        Xl        g)z
Initialize this exception instance.

:param qual_type: The qualifier type which was found to be duplicated.
    Must be a member of the QualType enum.
z&Duplicate qualifier type encountered: N)namesuperr   __init__	qual_type)selfr   message	__class__s      U/home/james-whalen/.local/lib/python3.13/site-packages/stix2patterns/v21/validator.pyr   $DuplicateQualifierTypeError.__init__   s(     ;Y^^K)49'B"    )r   )__name__
__module____qualname____firstlineno____doc__r   __static_attributes____classcell__)r   s   @r   r   r      s    
# #r   r   c                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)ValidationListener'   z:
Does some pattern validation via a parse tree traversal.
c                     S U l         g N_ValidationListener__qual_types)r   s    r   r   ValidationListener.__init__+   
     r   c                     U R                   b6  XR                   ;   a  [        U5      eU R                   R                  U5        g g r'   )r)   r   add)r   r   s     r   __check_qualifier_type)ValidationListener.__check_qualifier_type.   s>    (---1)<<!!%%i0	 )r   c                 "    [        5       U l        g r'   )setr)   r   ctxs     r   exitObservationExpressionSimple2ValidationListener.exitObservationExpressionSimple5   s    Er   c                     S U l         g r'   r(   r2   s     r   !exitObservationExpressionCompound4ValidationListener.exitObservationExpressionCompound8   r+   r   c                 B    U R                  [        R                  5        g r'   ))_ValidationListener__check_qualifier_typer   WITHINr2   s     r   exitObservationExpressionWithin2ValidationListener.exitObservationExpressionWithin;   s    ##HOO4r   c                 B    U R                  [        R                  5        g r'   )r:   r   REPEATSr2   s     r   !exitObservationExpressionRepeated4ValidationListener.exitObservationExpressionRepeated>   s    ##H$4$45r   c                 B    U R                  [        R                  5        g r'   )r:   r   	STARTSTOPr2   s     r   "exitObservationExpressionStartStop5ValidationListener.exitObservationExpressionStartStopA   s    ##H$6$67r   )__qual_typesN)r   r   r   r   r    r   r:   r4   r7   r<   r@   rD   r!    r   r   r$   r$   '   s*    !1"!568r   r$   c                    [        5       n[        U 5      nUR                  5         [        U5      n[	        U5      nUR                  5         UR                  U5        [        UR                  5       H)  u  pVUS:X  d  M  UR                  U   UR                  U'   M+     UR                  5       n[        UR                  5      S:X  a  [        5       n[        R                  R                  X5        UR!                  5       n	["        R$                  " U	5      n
U
(       a  UR                  R'                  U
5         [        R                  R                  [)        5       U5        UR                  $ UR                  $ ! [*         aA  nUR                  R-                  SSUR.                  S   -   5         SnAUR                  $ SnAff = f)z
Validates a pattern against the STIX Pattern grammar.  Error messages are
returned in a list.  The test passed if the returned list is empty.
z	<INVALID>r   zFAIL: N)r   r	   removeErrorListenersr   r   addErrorListener	enumerateliteralNamessymbolicNamespatternlenerr_stringsr   r   DEFAULTwalkpattern_datar   verify_objectextendr$   r   insertargs)rN   parseErrListenerlexerstreamparserilit_nametreeinspection_listener	patt_dataobj_validator_resultses               r   run_validatorrc   E   s   
 01W%E	 u%Fv&F !
,-
 !!4!45|#%+%9%9!%<F" 6 >>D ''(A-02$$%8?'446	 !1 > >y I ((//0EF	I##(();)=tD '''''' + 	I((//8affQi3GHH'''	Is   :(E: :
G,G  G)r    enumantlr4r   r    r   
exceptionsr   grammars.STIXPatternLexerr	   grammars.STIXPatternListenerr
   grammars.STIXPatternParserr   	inspectorr   Enumr   	Exceptionr   r$   rc   rG   r   r   <module>rn      sS     5  1 7 = 9 )99Z!;<#) #(8, 8<-(r   