o
    i                     @   s   d dl mZ d dlmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ ed	eee B d
ZG dd dee ZdS )    )Sequence)AnyGenericSupportsFloatTypeVar
get_origin)DeserializationErrorSerializationError)
bear_spray)	BaseModelValidationError)TypeAdapter)PydanticSerializationError)AsyncKeyValueT)boundc                   @   s  e Zd ZdZe		d'dedee dedB de	ddf
d	d
Z
deeef dedB fddZdedeeef fddZdddededB dedB fddZdddee dedB deedB  fddZddddedededB dedB ddf
ddZddddee dee dedB deedB  dB ddf
ddZdddededB de	fdd Zdddee dedB defd!d"ZdddededB deedB edB f fd#d$Zdddee dedB deeedB edB f  fd%d&ZdS )(PydanticAdapterz^Adapter around a KVStore-compliant Store that allows type-safe persistence of Pydantic models.NF	key_valuepydantic_modeldefault_collectionraise_on_validation_errorreturnc                 C   s@   || _ t|}|duot|t| _tt || _|| _|| _	dS )a9  Create a new PydanticAdapter.

        Args:
            key_value: The KVStore to use.
            pydantic_model: The Pydantic model to use.
            default_collection: The default collection to use.
            raise_on_validation_error: Whether to raise a ValidationError if the model is invalid.
        N)

_key_valuer   
issubclassr   _is_list_modelr   r   _type_adapter_default_collection_raise_on_validation_error)selfr   r   r   r   origin r    m/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/key_value/aio/adapters/pydantic/adapter.py__init__   s   
zPydanticAdapter.__init__valuec              
   C   sl   z| j r| j|dg W S | j|W S  ty5 } z| jr*d| }t||W Y d }~d S d }~ww )NitemsInvalid Pydantic model: )r   r   validate_pythongetr   r   r   r   r#   emsgr    r    r!   _validate_model.   s   

zPydanticAdapter._validate_modelc              
   C   s\   z| j rd| jj|ddiW S | jj|ddW S  ty- } z
d| }t||d }~ww )Nr$   json)moder%   )r   r   dump_pythonr   r	   r(   r    r    r!   _serialize_model:   s   

z PydanticAdapter._serialize_model)
collectionkeyr0   c                   s6   |p| j }| jj||dI dH  }r| j|dS dS )a0  Get and validate a model by key.

        Returns:
            The parsed model instance, or None if not present.

        Raises:
            DeserializationError if the stored data cannot be validated as the model and the PydanticAdapter is configured to
            raise on validation error.
        r1   r0   Nr#   )r   r   r'   r+   )r   r1   r0   r#   r    r    r!   r'   D   s
   

zPydanticAdapter.getkeysc                   4   |p j } jj||dI dH } fdd|D S )aK  Batch get and validate models by keys, preserving order.

        Returns:
            A list of parsed model instances, or None if missing.

        Raises:
            DeserializationError if the stored data cannot be validated as the model and the PydanticAdapter is configured to
            raise on validation error.
        r4   r0   Nc                    s    g | ]}|r j |d ndqS r3   Nr+   .0r#   r   r    r!   
<listcomp>c   s     z,PydanticAdapter.get_many.<locals>.<listcomp>)r   r   get_many)r   r4   r0   valuesr    r;   r!   r=   U   s   

zPydanticAdapter.get_many)r0   ttlr?   c                   s6   |p| j }| j|d}| jj||||dI dH  dS )zoSerialize and store a model.

        Propagates SerializationError if the model cannot be serialized.
        r3   )r1   r#   r0   r?   N)r   r/   r   put)r   r1   r#   r0   r?   
value_dictr    r    r!   r@   e   s   
zPydanticAdapter.putr>   c                   s<   |p j } fdd|D } jj||||dI dH  dS )zJSerialize and store multiple models, preserving order alignment with keys.c                    s   g | ]} j |d qS )r3   )r/   r9   r;   r    r!   r<   v   s    z,PydanticAdapter.put_many.<locals>.<listcomp>)r4   r>   r0   r?   N)r   r   put_many)r   r4   r>   r0   r?   value_dictsr    r;   r!   rB   p   s   
zPydanticAdapter.put_manyc                   "   |p| j }| jj||dI dH S )zGDelete a model by key. Returns True if a value was deleted, else False.r2   N)r   r   delete)r   r1   r0   r    r    r!   rE   z      
zPydanticAdapter.deletec                   rD   )zDDelete multiple models by key. Returns the count of deleted entries.r6   N)r   r   delete_many)r   r4   r0   r    r    r!   rG      rF   zPydanticAdapter.delete_manyc                   sN   |p| j }| jj||dI dH \}}|du rdS | j|d }r%||fS dS )zvGet a model and its TTL seconds if present.

        Returns (model, ttl_seconds) or (None, None) if missing.
        r2   N)NNr3   )r   r   r?   r+   )r   r1   r0   entryttl_infovalidated_modelr    r    r!   r?      s   
zPydanticAdapter.ttlc                   r5   )zKBatch get models with TTLs. Each element is (model|None, ttl_seconds|None).r6   Nc                    s(   g | ]\}}|r j |d nd|fqS r7   r8   )r:   rH   rI   r;   r    r!   r<      s   ( z,PydanticAdapter.ttl_many.<locals>.<listcomp>)r   r   ttl_many)r   r4   r0   entriesr    r;   r!   rK      s   
zPydanticAdapter.ttl_many)NF)__name__
__module____qualname____doc__r
   r   typer   strboolr"   dictr   r+   r/   r'   listr=   r   r@   r   rB   rE   intrG   tuplefloatr?   rK   r    r    r    r!   r      sJ    $
,.
 
$0<r   N)collections.abcr   typingr   r   r   r   r   key_value.shared.errorsr   r	   )key_value.shared.type_checking.bear_sprayr
   pydanticr   r   pydantic.type_adapterr   pydantic_corer   !key_value.aio.protocols.key_valuer   r   r   r    r    r    r!   <module>   s    