
    6i)                         U d Z ddlmZmZmZmZ ddlmZ e G d d                      Z G d d          Z	 G d d	          Z
d
aee
         ed<   de
fdZddedededeeeez  f         fdZdededefdZd
S )z
Plugin Parameter Validation System

Provides comprehensive validation for plugin parameters based on their schema.
Supports type validation, required checks, default values, and constraints.
    )AnyOptionalDictList)	dataclassc                   2    e Zd ZU dZeed<   eed<   eed<   dS )ValidationErrorz3Represents a validation error for a specific field.fieldmessagetypeN)__name__
__module____qualname____doc__str__annotations__     9/home/byschii/byschiidev/penelope/lib/plugin_validator.pyr	   r	      s1         ==JJJLLL
IIIIIr   r	   c                   ~    e Zd ZdZd ZddededefdZdefd	Zdefd
Z	de
eee
eef                  f         fdZdS )ValidationResultzResult of parameter validation.c                     g | _         d S )N)errorsselfs    r   __init__zValidationResult.__init__   s    -/r   
validationr
   r   
error_typec                 X    | j                             t          |||                     dS )zAdd a validation error.N)r   appendr	   )r   r
   r   r   s       r   	add_errorzValidationResult.add_error   s*    ?5':FFGGGGGr   returnc                 2    t          | j                  dk    S )zCheck if validation passed.r   )lenr   r   s    r   is_validzValidationResult.is_valid   s    4;1$$r   c                 8    | j         sdS | j         d         j        S )z)Get a single error message (first error). r   )r   r   r   s    r   get_error_messagez"ValidationResult.get_error_message#   s     { 	2{1~%%r   c                     i }| j         D ]B}|j        |vr
g ||j        <   ||j                                     |j        |j        d           C|S )z%Get detailed errors grouped by field.)r   r   )r   r
   r    r   r   )r   errors_by_fielderrors      r   get_detailed_errorsz$ValidationResult.get_detailed_errors)   sq    ;=[ 	 	E{/11/1,EK(// =
1 1    
 r   N)r   )r   r   r   r   r   r   r!   boolr%   r(   r   r   r,   r   r   r   r   r      s        ))0 0 0H Hs HS Hc H H H H%$ % % % %&3 & & & &T#tDcN/C*C%D      r   r   c                   ~    e Zd ZdZdededefdZdededefdZdededefdZ	dedefd	Z
d
edefdZd
edefdZdS )PluginValidatorz
    Validates plugin parameters against their schema.
    
    Performs:
    - Required parameter checking
    - Type validation
    - Constraint validation (min/max for numbers, pattern for strings)
    - Custom validation
    pluginparamsr"   c                     |                                 }|j        j        D ]!}|j        |vr|j        |j        ||j        <   "|S )z
        Apply default values from plugin parameter schema.
        
        Args:
            plugin: Plugin instance with metadata
            params: Request parameters
            
        Returns:
            Parameters with defaults applied
        )copymetadata
parametersnamedefaultr   r0   r1   result	param_defs        r   apply_defaultszPluginValidator.apply_defaultsD   sO     3 	; 	;I~V++	0A0M)2):y~&r   c                     t                      }|                     |||           |j        j        D ]}|                     |||           |S )a	  
        Validate parameters against plugin schema.
        
        Args:
            plugin: Plugin instance with metadata
            params: Request parameters to validate
            
        Returns:
            ValidationResult with any errors found
        )r   _run_custom_validationr4   r5   _validate_parameterr8   s        r   validatezPluginValidator.validateX   sa     "## 	##FFF;;;  3 	@ 	@I$$Y????r   r9   c                 
   t          |d          rr	 |                    |          }|r|                    d|d           dS dS # t          $ r2}|                    ddt	          |           d           Y d}~dS d}~ww xY wdS )z+Run plugin's custom validation if provided.validate_params_customcustomzValidation error: N)hasattrrA   r!   	Exceptionr   )r   r0   r1   r9   custom_errores         r   r=   z&PluginValidator._run_custom_validationn   s    6,-- 	UU%55f== H$$YhGGGGGH H U U U  ,IQ,I,I8TTTTTTTTTU	U 	Us   .A 
B 'A;;B c                     |j         }|j        r!||vr|                    |d| dd           dS ||vrdS ||         }|                     |||           |                     |||           dS )zValidate a single parameter.zMissing required parameter: ''requiredN)r6   rJ   r!   _validate_type_validate_constraints)r   r:   r1   r9   
param_namevalues         r   r>   z#PluginValidator._validate_parameterx   s    ^
  	*F":":=
===  
 F V##Fz" 	Iuf555 	""9eV<<<<<r   rN   c                    |j         }|j        }|dk    r;t          |t          t          f          s|                    |d| dd           dS dS |dk    r4t          |t                    s|                    |d| dd           dS dS |dv rt          |t                    s|                    |d| dd           dS |d	k    rG|                    d
          s4|                    d          s!|                    |d| dd           dS dS dS dS |dk    rI|j	        rD||j	        vr=d
                    |j	                  }|                    |d| d| d           dS dS dS dS )zValidate parameter type.numberParameter 'z' must be a numberr   checkboxz' must be a booleantexttextareaurlz' must be a stringrV   zhttp://zhttps://z+' must be a valid URL (http:// or https://)selectz, z' must be one of: N)r   r6   
isinstanceintfloatr!   r-   r   
startswithoptionsjoin)r   r:   rN   r9   
param_typerM   options_strs          r   rK   zPluginValidator._validate_type   s>   ^
^
 !!ec5\22   @*@@@      :%%eT**   A*AAA      666eS))   @*@@@    
 u$$((33 u7G7G
7S7S $$"]j]]]     %$    8##  U)2C%C%C"ii	(9::  M*MMMM     $# %C%Cr   c                    |j         }|j        }|dk    rt          |t          t          f          rt          |d          r4|j        -||j        k     r"|                    |d| d|j         d           t          |d          r4|j        -||j        k    r"|                    |d| d|j         d           |d	v r t          |t                    rt          |d
          rB|j
        ;t          |          |j
        k     r#|                    |d| d|j
         dd           t          |d          rB|j        ;t          |          |j        k    r#|                    |d| d|j         dd           t          |d          rZ|j        Uddl}|                    |j        |          s8t!          |dd          }|                    |d| d| d           dS dS dS dS dS dS )ae  
        Validate parameter constraints (min/max for numbers, length for strings, etc.).
        
        Looks for additional attributes on param_def:
        - min: Minimum value for numbers or minimum length for strings
        - max: Maximum value for numbers or maximum length for strings
        - pattern: Regex pattern for string validation
        rP   minNrQ   z' must be at least 
constraintmaxz' must be at most rS   
min_lengthz characters
max_lengthpatternr   pattern_descriptionzthe required formatz' must match )r6   r   rX   rY   rZ   rD   ra   r!   rc   r   rd   r$   re   rf   rematchgetattr)r   r:   rN   r9   rM   r^   rh   pattern_descs           r   rL   z%PluginValidator._validate_constraints   s    ^
^
 !!je&E&E!y%(( Y]-F9=(($$"TjTTY]TT$   y%(( Y]-F9=(($$"SjSSIMSS$   444E39O9O4y,// I4H4Tu::	 444$$"fjffYEYfff$   y,// I4H4Tu::	 444$$"ejeeIDXeee$   y),, 1B1N			xx	 1599 #*96KMb#c#cL$$"MjMM|MM$    - 5444$ 1N1N r   N)r   r   r   r   r   dictr;   r   r?   r=   r>   rK   rL   r   r   r   r/   r/   9   s        S $ 4    (s D 5E    ,US U$ UHX U U U U=T =CS = = = =20s 0<L 0 0 0 0d9c 9CS 9 9 9 9 9 9r   r/   N
_validatorr"   c                  :    t           t                      a t           S )z"Get the global validator instance.)rm   r/   r   r   r   get_validatorro     s     $&&
r   Fr0   r1   detailedc                     t                      }|                    | |          }|                                rdS |rd|                                fS d|                                fS )a  
    Validate plugin parameters.
    
    Args:
        plugin: Plugin instance with metadata
        params: Request parameters
        detailed: If True, return detailed error information
        
    Returns:
        Tuple of (is_valid, error_message_or_details)
    )Tr'   F)ro   r?   r%   r,   r(   )r0   r1   rp   	validatorr9   s        r   validate_plugin_paramsrs     so     I//F x 1f002222f..0000r   c                 J    t                      }|                    | |          S )z
    Apply default values to parameters.
    
    Args:
        plugin: Plugin instance with metadata
        params: Request parameters
        
    Returns:
        Parameters with defaults applied
    )ro   r;   )r0   r1   rr   s      r   apply_default_valuesru   #  s#     I##FF333r   )F)r   typingr   r   r   r   dataclassesr   r	   r   r/   rm   r   ro   rl   r-   tupler   rs   ru   r   r   r   <module>ry      s     - , , , , , , , , , , , ! ! ! ! ! !        ! ! ! ! ! ! ! !HC C C C C C C CN )-
H_% , , ,    1 13 1 1 1QVW[]`cg]gWgQh 1 1 1 104 4d 4t 4 4 4 4 4 4r   