o
    㥵i;"                     @  sf  d dl mZ d dlZd dlZd dlmZ d dlmZ ddlm	Z
 ddlmZmZ ddlmZ d,ddZG dd dejZG dd dedZG dd dejZG dd dedZG dd dejZG dd dedZG dd dejZG dd dedZG d d! d!ejZG d"d# d#edZG d$d% d%ejZG d&d' d'edZG d(d) d)ejZG d*d+ d+edZdS )-    )annotationsN)
HTTPStatus)	BaseModel   )specification)create_root_modelto_jsonable_python)safe_issubclassjson_encoders=typing.Tuple[type, typing.Callable[[typing.Any], typing.Any]]return)typing.Callable[[typing.Any], typing.Any]c                    s   d fdd}|S )Nobj
typing.Anyr   c                   s,    D ]\}}t | |r||   S qt| S )N)
isinstancer   )r   type_encoderr
    A/home/ubuntu/.local/lib/python3.10/site-packages/kui/responses.pyjson_encoder   s
   
z)create_json_encoder.<locals>.json_encoder)r   r   r   r   r   )r
   r   r   r   r   create_json_encoder   s   r   c                   @     e Zd ZdddZdS )	JSONResponseDocsMetaclass
parameterstyping.Tuple[int, typing.Dict[str, spec.Header | spec.Reference], typing.Type[BaseModel] | spec.Schema | typing.Any] | typing.Tuple[int, typing.Dict[str, spec.Header | spec.Reference]] | intr   spec.Responsesc                 C  s   t |tr!t|dv sJ t|dkr|i \}}}n|\}}}n|i i }}}t |ts4|dks4J t|t|j|di}|rjt |trJ|}nt|dddu rZt	|t
rZ|}nt|}dd|ii|t| d	< |S )
zQ
        Use JSONResponse[status, headers, content] to describe response
        )      r   defaultdescriptionheaders
__origin__Nzapplication/jsonschemacontent)r   tuplelenintstrr   r!   dictgetattrr	   r   r   )clsr   status_coder"   r%   docsreal_contentr   r   r   __getitem__   s.   

z%JSONResponseDocsMetaclass.__getitem__N)r   r   r   r   __name__
__module____qualname__r0   r   r   r   r   r          r   c                   @     e Zd ZdZdS )JSONResponseMixinz1
    JSON response with OpenAPI docs support
    Nr2   r3   r4   __doc__r   r   r   r   r7   S       r7   )	metaclassc                   @  r   )	FileResponseDocsMetaclassr   Gtyping.Tuple[str, typing.Dict[str, spec.Header | spec.Reference]] | strr   r   c                 C  sj   t |tr
|\}}n|i }}t |tsJ tjj|ddddii|dtjj|ddddii|ddS )zN
        Use FileResponse[content_type, headers] to describe response
        r$   stringbinary)typeformatr!   r%   r"   )200206)r   r&   r)   r   OKr!   PARTIAL_CONTENT)r,   r   content_typer"   r   r   r   r0   Z   s   


z%FileResponseDocsMetaclass.__getitem__N)r   r=   r   r   r1   r   r   r   r   r<   Y   r5   r<   c                   @  r6   )FileResponseMixinz1
    File response with OpenAPI docs support
    Nr8   r   r   r   r   rH   z   r:   rH   c                   @  r   )	PlainTextResponseDocsMetaclassr   Gtyping.Tuple[int, typing.Dict[str, spec.Header | spec.Reference]] | intr   r   c                 C  R   t |tr
|\}}n|i }}t |tsJ t|t|jddddiii|diS )zM
        Use PlainTextResponse[status, headers] to describe response
        z
text/plainr$   r@   r>   rB   r   r&   r(   r)   r   r!   r,   r   r-   r"   r   r   r   r0         


z*PlainTextResponseDocsMetaclass.__getitem__Nr   rJ   r   r   r1   r   r   r   r   rI      r5   rI   c                   @  r6   )PlainTextResponseMixinz7
    Plain text response with OpenAPI docs support
    Nr8   r   r   r   r   rP      r:   rP   c                   @  r   )	HTMLResponseDocsMetaclassr   rJ   r   r   c                 C  rK   )zH
        Use HTMLResponse[status, headers] to describe response
        z	text/htmlr$   r@   r>   rB   rL   rM   r   r   r   r0      rN   z%HTMLResponseDocsMetaclass.__getitem__NrO   r1   r   r   r   r   rQ      r5   rQ   c                   @  r6   )HTMLResponseMixinz1
    HTML response with OpenAPI docs support
    Nr8   r   r   r   r   rR      r:   rR   c                   @  r   )	RedirectResponseDocsMetaclassr   rJ   r   r   c                 C  sT   t |tr
|\}}n|i }}t |tsJ t|t|jddddiii|diS )zL
        Use RedirectResponse[status, headers] to describe response
        Locationr$   r@   r>   r    rL   rM   r   r   r   r0      s   


z)RedirectResponseDocsMetaclass.__getitem__NrO   r1   r   r   r   r   rS      r5   rS   c                   @  r6   )RedirectResponseMixinz5
    Redirect response with OpenAPI docs support
    Nr8   r   r   r   r   rU      r:   rU   c                   @  r   )	SendEventResponseDocsMetaclassr   rJ   r   r   c                 C  rK   )zM
        Use SendEventResponse[status, headers] to describe response
        ztext/event-streamr$   r@   r>   rB   rL   rM   r   r   r   r0      s   


z*SendEventResponseDocsMetaclass.__getitem__NrO   r1   r   r   r   r   rV      r5   rV   c                   @  r6   )SendEventResponseMixinz7
    Send event response with OpenAPI docs support
    Nr8   r   r   r   r   rW      r:   rW   c                   @  r   )	StreamResponseDocsMetaclassr   rJ   r   r   c                 C  sV   t |tr
|\}}n|i }}t |tsJ t|t|jdddiddi|diS )zJ
        Use StreamResponse[status, headers] to describe response
        zTransfer-Encodingr@   r>   chunked)r$   r!   r    rL   rM   r   r   r   r0      s   


z'StreamResponseDocsMetaclass.__getitem__NrO   r1   r   r   r   r   rX      r5   rX   c                   @  r6   )StreamResponseMixinz3
    Stream response with OpenAPI docs support
    Nr8   r   r   r   r   rZ     r:   rZ   )r
   r   r   r   ) 
__future__r   abctypinghttpr   pydanticr   openapir   specpydantic_compatibler   r   utilsr	   r   ABCMetar   r7   r<   rH   rI   rP   rQ   rR   rS   rU   rV   rW   rX   rZ   r   r   r   r   <module>   s.    
9!