o
    ߥi 	                     @   s   d dl Z d dlmZmZ d dlmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZ ee
gee f Zded	efd
dZdeeged f d	efddZdee
egee f d	eegef fddZdS )    N)	AwaitableCallable)ASGIAppReceiveScopeSend   )Request)Response)	WebSocketWebsocketDenialResponseviewreturnc              	      ,   t  dtdtdtddf fdd}|S )z
    This can turn a callable object into a ASGI application.

    ```python
    @request_response
    async def f(request: Request) -> Response:
        ...
    ```
    scopereceivesendr   Nc                    sT   | d dkrt td| ||I d H S t| ||} |I d H }|| ||I d H S )Ntype	websocket  )r   r
   r	   )r   r   r   requestresposner    G/home/ubuntu/.local/lib/python3.10/site-packages/baize/asgi/shortcut.pyasgi   s   zrequest_response.<locals>.asgi	functoolswrapsr   r   r   r   r   r   r   r   request_response   s    r    c              	      r   )z
    This can turn a callable object into a ASGI application.

    ```python
    @websocket_session
    async def f(websocket: WebSocket) -> None:
        ...
    ```
    r   r   r   r   Nc                    sF   | d dkrt d| ||I d H  d S t| ||} |I d H  d S )Nr   httpr   )r
   r   )r   r   r   r   r   r   r   r   /   s
   zwebsocket_session.<locals>.asgir   r   r   r   r   websocket_session$   s    r"   handlerc                    s$   t  dtdtf fdd}|S )a  
    This can turn a callable object into a decorator for view.

    ```python
    @decorator
    async def m(request: Request, next_call: Callable[[Request], Awaitable[Response]]) -> Response:
        ...
        response = await next_call(request)
        ...
        return response


    @request_response
    @m
    async def v(request: Request) -> Response:
        ...
    ```
    	next_callr   c                    s&   t  dtdtf fdd}|S )z/
        This is the actual decorator.
        r   r   c                    s    | I d H S )Nr   )r   )r#   r$   r   r   r   V   s   z"decorator.<locals>.d.<locals>.view)r   r   r	   r
   )r$   r   r#   )r$   r   dP   s   zdecorator.<locals>.d)r   r   ViewType)r#   r&   r   r%   r   	decorator:   s   r(   )r   typingr   r   baize.typingr   r   r   r   requestsr	   	responsesr
   r   r   r   r'   r    r"   r(   r   r   r   r   <module>   s     