
    E6i^                         d dl Z d dlZd dlmZ d dlmZ ddlmZ  e j                  e	      Z
 ej                  d      Z G d de      Z G d	 d
e      Z G d de      ZddZy)    N)OrderedDict)isclass   )	RestErrorz\{|\}|\,|[\w_:\-\*]+c                       e Zd ZdZy)	MaskErrorz#Raised when an error occurs on maskN__name__
__module____qualname____doc__     S/home/azureuser/techstart-app/venv/lib/python3.12/site-packages/flask_restx/mask.pyr   r          -r   r   c                       e Zd ZdZy)
ParseErrorz#Raised when the mask parsing failedNr	   r   r   r   r   r      r   r   r   c                   B     e Zd ZdZd fd	Zd Zd Zd Zd Zd Z	 xZ
S )	Maskz
    Hold a parsed mask.

    :param str|dict|Mask mask: A mask, parsed or not
    :param bool skip: If ``True``, missing fields won't appear in result
    c                    || _         t        |t              r$t        t        |           | j                  |       y t        |t        t        f      rt        t        |   |fi | y || _         t        t        |   di | y )Nr   )	skip
isinstancestrsuperr   __init__parsedictr   )selfmaskr   kwargs	__class__s       r   r   zMask.__init__"   si    	dC $&(JJtt[12$&t6v6DI$&00r   c                    |sy| j                  |      }| }d}g }t        j                  |      D ]  }|dk(  r?||vrt        d      t	        | j
                        ||<   |j                  |       ||   }n<|dk(  r|st        d      |j                         }n|dk(  r|dv rt        d	      d
||<   |} |rt        d      y)a  
        Parse a fields mask.
        Expect something in the form::

            {field,nested{nested_field,another},last}

        External brackets are optionals so it can also be written::

            field,nested{nested_field,another},last

        All extras characters will be ignored.

        :param str mask: the mask string to parse
        :raises ParseError: when a mask is unparseable/invalid

        N{zUnexpected opening bracket)r   }zUnexpected closing bracket,)r%   r#   NzUnexpected commaTMissing closing bracket)cleanLEXERfindallr   r   r   appendpop)r   r   fieldspreviousstacktokens         r   r   z
Mask.parse-   s    " zz$]]4( 	E|6)$%ABB#'TYY#7x V$)#$%ABB#//$%788 $uH#	& 677 r   c                     |j                  dd      j                         }|d   dk(  r|d   dk7  rt        d      |dd }|S )	zRemove unnecessary characters
 r   r#   r$   r&   r   )replacestripr   )r   r   s     r   r'   z
Mask.clean\   sM    ||D"%++-7c>Bx3 !:;;":Dr   c                    ddl m} t        |t        t        t
        f      r|D cg c]  }| j                  |       c}S t        ||j                  |j                  |j                  f      r|j                  |       S t        |      |j                  k(  r(|j                  |j                  |j                  |       S ||j                  k(  r|j                  |       S t        ||j                        s!t        |      r!t!        ||j                        rt#        d      t        |t$        t&        f      st)        |d      r|j*                  }| j-                  |      S c c}w )z
        Apply a fields mask to the data.

        :param data: The data or model to apply mask on
        :raises MaskError: when unable to apply the mask

        r   )r,   )default	attributer   )r   zMask is inconsistent with model__dict__)r2   r,   r   listtuplesetapplyNestedList	PolymorphclonetypeRawr7   r8   r   
issubclassr   r   r   hasattrr9   filter_data)r   datar,   ds       r   r=   z
Mask.applyf   s    	 dT5#./+/0aDJJqM00v}}fkk6;K;KLM::d##$Z6::%::dlldnnSW:XXVZZ::4:((tVZZ(t}4, =>>D4"5674;T==D%%% 1s   E!c                    i }| j                         D ]  \  }}|dk(  rt        |t              r>|j                  |d      }| j                  r|=|d||<   E|j                  |      ||<   Z| j                  r||vrk|j                  |d      ||<    d| j                         v r"|j                         D ]  \  }}||vs|||<    |S )z
        Handle the data filtering given a parsed mask

        :param dict data: the raw data to filter
        :param list mask: a parsed mask to filter against
        :param bool skip: whether or not to skip missing fields

        *N)itemsr   r   getr   r=   keys)r   rG   outfieldcontentnestedkeyvalues           r   rF   zMask.filter_data   s     "jjl 	3NE7|GT*%.99^!%CJ!(v!6CJuD0!XXeT2E
	3  $))+"jjl %
Uc>$CH% 
r   c                     dj                  dj                  | j                         D cg c]3  \  }}t        |t              rdj                  |t        |      f      n|5 c}}            S c c}}w )Nz{{{0}}}r%   r2   )formatjoinrK   r   r   r   )r   kvs      r   __str__zMask.__str__   sg    HH !%

1 -7q$,?BGGQAK(QF
 	
s   8A.)NF)r
   r   r   r   r   r   r'   r=   rF   rY   __classcell__)r!   s   @r   r   r      s)    	1-8^&@@
r   r   c                 8    t        ||      j                  |       S )a  
    Apply a fields mask to the data.

    :param data: The data or model to apply mask on
    :param str|Mask mask: the mask (parsed or not) to apply on data
    :param bool skip: If rue, missing field won't appear in result
    :raises MaskError: when unable to apply the mask

    )r   r=   )rG   r   r   s      r   r=   r=      s     d!!$''r   )F)loggingrecollectionsr   inspectr   errorsr   	getLoggerr
   logcompiler(   r   r   r   r=   r   r   r   <module>rd      sc     	 #  g!

*+		 		 	T
; T
n
(r   