o
    tfM                     @  s  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	m
Z
mZ d dlmZmZ d dlmZmZmZmZ d dlmZmZ d	Zejd
edZG dd deje Zd&ddZd'ddZd'ddZd(dd Zej eej!e"ee f gef Z#	d)d*d$d%Z$dS )+    )annotationsN)
Middleware)Request)JSONResponsePlainTextResponseResponse)MountRoute)ASGIAppReceiveScopeSend)ProviderProtocolTilesetProtocolz/tilesets/api/v1/TilesetType)boundc                   @  sD   e Zd ZdZdddZedd	d
ZedddZedddZdS )TilesetResourcezA tileset resource.tilesetr   providerr   c                 C  s   || _ || _dS )zInitialize a tileset resource.

        Parameters
        ----------
        tileset : TilesetProtocol
            The tileset.
        provider : ProviderProtocol
            The server provider.
        N)_tileset	_provider)selfr   r    r   Y/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/servir/_tilesets.py__init__   s   

zTilesetResource.__init__returnc                 C  s   | j S )zThe tileset.)r   r   r   r   r   r   &   s   zTilesetResource.tilesetstrc                 C  s   | j jS )z&The unique identifier for the tileset.)r   uidr   r   r   r   r   +   s   zTilesetResource.uidc                 C  s   | j j t S )zThe server url.)r   url_MOUNT_PATHr   r   r   r   server0   s   zTilesetResource.serverN)r   r   r   r   )r   r   )r   r   )	__name__
__module____qualname____doc__r   propertyr   r   r!   r   r   r   r   r      s    
r   queryr   fieldr   	list[str]c                   s&   dd |  dD } fdd|D S )aP  Parse chained query params into list.

    Parameters
    ----------
    query : str
        The query string. For example, "d=id1&d=id2&d=id3".
    field : str
        The field to extract. For example, "d".

    Returns
    -------
    list[str]
        The list of values for the given field. For example, ['id1', 'id2', 'id3'].
    c                 S  s   g | ]}| d qS )=split).0xr   r   r   
<listcomp>E       zget_list.<locals>.<listcomp>&c                   s   g | ]
\}}| kr|qS r   r   )r-   kvr(   r   r   r/   F   s    r+   )r'   r(   Z	kv_tuplesr   r4   r   get_list6   s   r5   requestr   tilesets5typing.Mapping[str, TilesetResource[TilesetProtocol]]r   c                   s(   t | jjd} fdd|D }t|S )a  Request handler for the tileset_info/ endpoint.

    Parameters
    ----------
    request : Request
        The request.
    tilesets : typing.Mapping[str, TilesetResource]
        The tileset resources.

    Returns
    -------
    JSONResponse
        The server response.
    dc                   s2   i | ]}|| v r | j  nd d| iqS )errorzNo such tileset with uid: )r   info)r-   r   r7   r   r   
<dictcomp>[   s    z tileset_info.<locals>.<dictcomp>)r5   r   r'   r   )r6   r7   Zuidsr;   r   r<   r   tileset_infoI   s
   
r>   c                 C  s   t t| jjd}|stddidS g }tjt|dd dD ]"\}}||}|s6tdd| id  S |	|j
t| qd	d
 |D }t|S )a  Request handler for the tiles/ endpoint.

    Parameters
    ----------
    request : Request
        The request.
    tilesets : typing.Mapping[str, TilesetResource]
        The tileset resources.

    Returns
    -------
    JSONResponse
        The server response.
    r9   r:   zNo tiles requested  c                 S  s   |  dd S )N.r   r+   )tidr   r   r   <lambda>{   s    ztiles.<locals>.<lambda>)iterablekeyz$No tileset found for requested uid: c                 S  s   i | ]\}}||qS r   r   )r-   rA   Ztvalr   r   r   r=      r0   ztiles.<locals>.<dictcomp>)setr5   r   r'   r   	itertoolsgroupbysortedgetextendr   tileslist)r6   r7   Zrequested_tidsrK   r   Ztidstileset_resourcedatar   r   r   rK   d   s   
rK    PlainTextResponse | JSONResponsec                 C  s`   | j d}|du rtddidS || }|j }d|v s"J dtdd	d
 |d D S )a  Request handler for the chrom-sizes/ endpoint.

    Chromsizes are returned as a plain text response, as a TSV:

        chr1    249250621
        chr2    243199373
        ...

    Parameters
    ----------
    request : Request
        The request.
    tilesets : typing.Mapping[str, TilesetResource]
        The tileset resources.

    Returns
    -------
    PlainTextResponse | JSONResponse
        The server response. If the tileset does not have chromsizes, a JSON
        response with an error message is returned.
    idNr:   zNo uid provided.r?   
chromsizeszNo chromsizes in tileset info
c                 s  s"    | ]\}}| d | V  qdS )	Nr   )r-   Zchromsizer   r   r   	<genexpr>   s     zchromsizes.<locals>.<genexpr>)Zquery_paramsrI   r   r   r;   r   join)r6   r7   r   rM   r;   r   r   r   rQ      s   
rQ   tileset_resourcesscope_idr   c                   sZ   G  fddd}d fdd}t ttd	|ttd
|ttd|tgt|gdS )ar  Create a route for tileset endpoints.

    Parameters
    ----------
    tileset_resources : typing.Mapping[str, TilesetResource]
        The tileset resources.
    scope_id : str, optional
        The scope id to use for passing the tileset resources to the
        request handlers, by default "tilesets".

    Returns
    -------
    Mount
        The API route.
    c                      s*   e Zd ZdZdddZd fddZdS )z/create_tileset_route.<locals>.TilesetMiddlewarez:Middleware to inject tileset resources into request scope.appr
   r   Nonec                 S  s
   || _ d S NrY   )r   rY   r   r   r   r      s   
z8create_tileset_route.<locals>.TilesetMiddleware.__init__scoper   receiver   sendr   c                   s"   | < |  |||I d H  d S r[   r\   )r   r]   r^   r_   rX   rW   r   r   __call__   s   z8create_tileset_route.<locals>.TilesetMiddleware.__call__N)rY   r
   r   rZ   )r]   r   r^   r   r_   r   r   rZ   )r"   r#   r$   r%   r   ra   r   r`   r   r   TilesetMiddleware   s    
rb   funcTilesetEndpointr   $typing.Callable[[Request], Response]c                   s   d fdd}|S )	z2Inject tileset resources as secondrequest handler.r6   r   r   r   c                   s    | | j  S r[   )r]   )r6   )rc   rX   r   r   wrapper   s   z>create_tileset_route.<locals>.inject_tilesets.<locals>.wrapperN)r6   r   r   r   r   )rc   rf   )rX   )rc   r   inject_tilesets   s   z-create_tileset_route.<locals>.inject_tilesetsz/tileset_info/z/tiles/z/chrom-sizes/)pathZroutesZ
middlewareN)rc   rd   r   re   )r   r    r	   r>   rK   rQ   r   )rW   rX   rb   rg   r   r`   r   create_tileset_route   s   
ri   )r'   r   r(   r   r   r)   )r6   r   r7   r8   r   r   )r6   r   r7   r8   r   rO   r<   )rW   r8   rX   r   r   r   )%
__future__r   rF   typingZstarlette.middlewarer   Zstarlette.requestsr   Zstarlette.responsesr   r   r   Zstarlette.routingr   r	   Zstarlette.typesr
   r   r   r   Zservir._protocolsr   r   r    TypeVarr   Genericr   r5   r>   rK   rQ   CallableMappingr   rd   ri   r   r   r   r   <module>   s*    
 


##