o
    biV                     @   s   d dl mZmZ d dlmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ G dd deZG dd dZedZdedefddZdS )    )CallableMapping)	AnnotatedAnyBinaryIOTypeVarcast)Doc)GetJsonSchemaHandler)URL)Address)FormData)Headers)QueryParams)State)
UploadFilec                	       sz  e Zd ZU dZeeedf ed< eedB edf ed< ee	dB edf ed< ee
ed	f ed
< eedB edf ed< deeedf ddf fddZ	d'dee	edf def fddZdee	edf ddf fddZd( fddZedededd fddZed eeef d!edeeef fd"d#Zed$ee d!eegeeef f deeef fd%d&Z  ZS ))r   aA  
    A file uploaded in a request.

    Define it as a *path operation function* (or dependency) parameter.

    If you are using a regular `def` function, you can use the `upload_file.file`
    attribute to access the raw standard Python file (blocking, not async), useful and
    needed for non-async code.

    Read more about it in the
    [FastAPI docs for Request Files](https://fastapi.tiangolo.com/tutorial/request-files/).

    ## Example

    ```python
    from typing import Annotated

    from fastapi import FastAPI, File, UploadFile

    app = FastAPI()


    @app.post("/files/")
    async def create_file(file: Annotated[bytes, File()]):
        return {"file_size": len(file)}


    @app.post("/uploadfile/")
    async def create_upload_file(file: UploadFile):
        return {"filename": file.filename}
    ```
    z,The standard Python file object (non-async).fileNzThe original file name.filenamezThe size of the file in bytes.sizezThe headers of the request.headersz2The content type of the request, from the headers.content_typedatazA
                The bytes to write to the file.
                returnc                       t  |I dH S )z
        Write some bytes to the file.

        You normally wouldn't use this from a file you read in a request.

        To be awaitable, compatible with async, this is run in threadpool.
        N)superwrite)selfr   	__class__ X/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/fastapi/datastructures.pyr   B      zUploadFile.writezL
                The number of bytes to read from the file.
                c                    r   )z|
        Read some bytes from the file.

        To be awaitable, compatible with async, this is run in threadpool.
        N)r   read)r   r   r   r   r    r#   V   s   zUploadFile.readoffsetzO
                The position in bytes to seek to in the file.
                c                    r   )z
        Move to a position in the file.

        Any next read or write will be done from that position.

        To be awaitable, compatible with async, this is run in threadpool.
        N)r   seek)r   r$   r   r   r    r%   h   r!   zUploadFile.seekc                    s   t   I dH S )zm
        Close the file.

        To be awaitable, compatible with async, this is run in threadpool.
        N)r   closer   r   r   r    r&   |   s   zUploadFile.close_UploadFile__input_value_c                 C   s&   t |tstdt| tt|S )NzExpected UploadFile, received: )
isinstanceStarletteUploadFile
ValueErrortyper   r   )clsr(   r)   r   r   r    	_validate   s   

zUploadFile._validatecore_schemahandlerc                 C   s
   dddS )Nstringzapplication/octet-stream)r-   contentMediaTyper   )r.   r0   r1   r   r   r    __get_pydantic_json_schema__   s   
z'UploadFile.__get_pydantic_json_schema__sourcec                 C   s   ddl m} || jS )N   )"with_info_plain_validator_function)
_compat.v2r7   r/   )r.   r5   r1   r7   r   r   r    __get_pydantic_core_schema__   s   
z'UploadFile.__get_pydantic_core_schema__)r"   )r   N)__name__
__module____qualname____doc__r   r   r	   __annotations__strintr   bytesr   r#   r%   r&   classmethodr   r/   r   r
   dictr4   r-   r   r9   __classcell__r   r   r   r    r      s   
 !





r   c                   @   s>   e Zd ZdZdefddZdefddZdedefd	d
Z	dS )DefaultPlaceholderz
    You shouldn't use this class directly.

    It's used internally to recognize when a default value has been overwritten, even
    if the overridden default value was truthy.
    valuec                 C   s
   || _ d S NrF   )r   rF   r   r   r    __init__      
zDefaultPlaceholder.__init__r   c                 C   s
   t | jS rG   )boolrF   r'   r   r   r    __bool__   rJ   zDefaultPlaceholder.__bool__oc                 C   s   t |to
|j| jkS rG   )r*   rE   rF   )r   rM   r   r   r    __eq__   s   zDefaultPlaceholder.__eq__N)
r:   r;   r<   r=   r   rI   rK   rL   objectrN   r   r   r   r    rE      s
    rE   DefaultTyperF   r   c                 C   s   t | S )z
    You shouldn't use this function directly.

    It's used internally to recognize when a default value has been overwritten, even
    if the overridden default value was truthy.
    )rE   rH   r   r   r    Default   s   rQ   N)collections.abcr   r   typingr   r   r   r   r   annotated_docr	   pydanticr
   starlette.datastructuresr   r   r   r   r   r   r   r+   rE   rP   rQ   r   r   r   r    <module>   s      