U
    gi                     @   s   d Z ddlZddlmZ ddl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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 e
edddddG dd dZdS )z[This module contains a class that describes a single parameter of a request to the Bot API.    N)	dataclass)datetime)ListOptionalSequenceTuplefinal)	InputFile)
InputMediaInputPaidMedia)InputSticker)TelegramObject)to_timestamp)
StringEnum)UploadFileDictTF)repreqorderfrozenc                   @   s   e Zd ZU dZdZeed< eed< ee	e
  ed< eee dddZeee dd	d
Zeeeee	e
 f dddZeeed dddZdS )RequestParametera  Instances of this class represent a single parameter to be sent along with a request to
    the Bot API.

    .. versionadded:: 20.0

    Warning:
        This class intended is to be used internally by the library and *not* by the user. Changes
        to this class are not considered breaking changes and may not be documented in the
        changelog.

    Args:
        name (:obj:`str`): The name of the parameter.
        value (:obj:`object` | :obj:`None`): The value of the parameter. Must be JSON-dumpable.
        input_files (List[:class:`telegram.InputFile`], optional): A list of files that should be
            uploaded along with this parameter.

    Attributes:
        name (:obj:`str`): The name of the parameter.
        value (:obj:`object` | :obj:`None`): The value of the parameter.
        input_files (List[:class:`telegram.InputFile` | :obj:`None`): A list of files that should
            be uploaded along with this parameter.
    )input_filesnamevaluer   r   r   )returnc                 C   s,   t | jtr| jS | jdkr dS t| jS )zThe JSON dumped :attr:`value` or :obj:`None` if :attr:`value` is :obj:`None`.
        The latter can currently only happen if :attr:`input_files` has exactly one element that
        must not be uploaded via an attach:// URI.
        N)
isinstancer   strjsondumpsself r    F/tmp/pip-unpacked-wheel-swnnwir2/telegram/request/_requestparameter.py
json_valueB   s
    
zRequestParameter.json_valuec                    s    j s
dS  fdd j D S )zA dict with the file data to upload, if any.

        .. versionchanged:: 21.5
            Content may now be a file handle.
        Nc                    s   i | ]}|j p j|jqS r    )Zattach_namer   Zfield_tuple).0
input_filer   r    r!   
<dictcomp>W   s   
 z3RequestParameter.multipart_data.<locals>.<dictcomp>)r   r   r    r   r!   multipart_dataN   s
    
zRequestParameter.multipart_data)r   r   c                 C   s<  t | trt| g fS t | tr*| jg fS t | trP| jrF| j| gfS d| gfS t | ttfrt | j	tr| 
 }| j	jr| j	j|d< n|dd |dd}t |tr|jr|j|d< n|dd || j	|gfS || j	gfS t | trt | jtr| 
 }| jj|d< || jgfS t | tr4| 
 g fS | g fS )aX  Converts `value` into something that we can json-dump. Returns two values:
        1. the JSON-dumpable value. May be `None` in case the value is an InputFile which must
           not be uploaded via an attach:// URI
        2. A list of InputFiles that should be uploaded for this value

        Note that we handle files differently depending on whether attaching them via an URI of the
        form attach://<name> is documented to be allowed or not.
        There was some confusion whether this worked for all files, so that we stick to the
        documented ways for now.
        See https://github.com/tdlib/telegram-bot-api/issues/167 and
        https://github.com/tdlib/telegram-bot-api/issues/259

        This method only does some special casing for our own helper class StringEnum, but not
        for general enums. This is because:
        * tg.constants currently only uses IntEnum as second enum type and json dumping that
          is no problem
        * if a user passes a custom enum, it's unlikely that we can actually properly handle it
          even with some special casing.
        Nmedia	thumbnailsticker)r   r   r   r   r   r	   Z
attach_urir
   r   r'   Zto_dictpopgetr   r)   r   )r   datar(   r    r    r!   !_value_and_input_files_from_input\   s6    





z2RequestParameter._value_and_input_files_from_input)keyr   r   c                 C   s   t |ttfsjt |trjg }g }|D ].}| |\}}|dk	rH|| || q$t|||rb|nddS | |\}}t|||r|nddS )zBuilds an instance of this class for a given key-value pair that represents the raw
        input as passed along from a method of :class:`telegram.Bot`.
        N)r   r   r   )r   r   bytesr   r-   appendextendr   )clsr.   r   Zparam_valuesr   objZparam_valuer$   r    r    r!   
from_input   s&    
  
  
zRequestParameter.from_inputN)__name__
__module____qualname____doc__	__slots__r   __annotations__objectr   r   r	   propertyr"   r   r&   staticmethodr   r-   classmethodr4   r    r    r    r!   r   "   s   
=r   )r8   r   Zdataclassesr   r   typingr   r   r   r   r   Ztelegram._files.inputfiler	   Ztelegram._files.inputmediar
   r   Ztelegram._files.inputstickerr   Ztelegram._telegramobjectr   Ztelegram._utils.datetimer   Ztelegram._utils.enumr   Ztelegram._utils.typesr   r   r    r    r    r!   <module>   s   