U
    gL                  
   @   sP  d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZmZ erdddlmZmZ e
deedeedf d	Zeee eee ef d
ddZeeedef d
ddZee eee eedeedf f d
ddZeee d
ddZee ed
ddZdeedf ee	d  ee eeeedef dddZdS )a  This module contains helper functions related to handling of files.

.. versionchanged:: 20.0
   Previously, the contents of this module were available through the (no longer existing)
   module ``telegram._utils.helpers``.

Warning:
    Contents of this module are intended to be used internally by the library and *not* by the
    user. Changes to this module are not considered breaking changes and may not be documented in
    the changelog.
    )Path)
IOTYPE_CHECKINGAnyOptionalTupleTypeTypeVarUnioncastoverload)	FileInputFilePathInput)	InputFileTelegramObject_Tr   N)bound)objreturnc                 C   s   d S N r   r   r   9/tmp/pip-unpacked-wheel-swnnwir2/telegram/_utils/files.py	load_file*   s    r   c                 C   s   d S r   r   r   r   r   r   r   .   s    c              
   C   sX   | dkrdS z|   }W n. tk
rF   dtttdttf | f Y S X t| }||fS )ztIf the input is a file handle, read the data and name and return it. Otherwise, return
    the input unchanged.
    N)NNr   )readAttributeErrorr   r
   bytesstrr   guess_file_name)r   contentsfilenamer   r   r   r   2   s     c                 C   s&   t | dr"t| jts"t| jjS dS )zgIf the input is a file handle, read name and return it. Otherwise, return
    the input unchanged.
    nameN)hasattr
isinstancer!   intr   r   r   r   r   r   E   s    r   c                 C   s:   | dkrdS t | }z
| W S  tk
r4   Y dS X dS )zw
    Checks if a given string is a file on local system.

    Args:
        obj (:obj:`str`): The string to check.
    NF)r   is_file	Exception)r   pathr   r   r   is_local_fileO   s    
r(   Fr   )
file_inputtg_typer    attach
local_moder   c                 C   s   ddl m} t| tr0| dr0|s,td| S t| ttfrxt| rtt| }|r^| 	 S ||j
dd||dS | S t| tr|| ||dS t| dr|tt| ||dS |rt| |r| jS | S )	a  
    Parses input for sending files:

    * For string input, if the input is an absolute path of a local file:

        * if ``local_mode`` is ``True``, adds the ``file://`` prefix. If the input is a relative
        path of a local file, computes the absolute path and adds the ``file://`` prefix.
        * if ``local_mode`` is ``False``, loads the file as binary data and builds an
          :class:`InputFile` from that

      Returns the input unchanged, otherwise.
    * :class:`pathlib.Path` objects are treated the same way as strings.
    * For IO and bytes input, returns an :class:`telegram.InputFile`.
    * If :attr:`tg_type` is specified and the input is of that type, returns the ``file_id``
      attribute.

    Args:
        file_input (:obj:`str` | :obj:`bytes` | :term:`file object` | :class:`~telegram.InputFile`            | Telegram media object): The input to parse.
        tg_type (:obj:`type`, optional): The Telegram media type the input can be. E.g.
            :class:`telegram.Animation`.
        filename (:obj:`str`, optional): The filename. Only relevant in case an
            :class:`telegram.InputFile` is returned.
        attach (:obj:`bool`, optional): Pass :obj:`True` if the parameter this file belongs to in
            the request to Telegram should point to the multipart data via an ``attach://`` URI.
            Defaults to `False`. Only relevant if an :class:`telegram.InputFile` is returned.
        local_mode (:obj:`bool`, optional): Pass :obj:`True` if the bot is running an api server
            in ``--local`` mode.

    Returns:
        :obj:`str` | :class:`telegram.InputFile` | :obj:`object`: The parsed input or the untouched
        :attr:`file_input`, in case it's no valid file input.
    r   )r   zfile://zBSpecified file input is a file URI, but local mode is not enabled.rb)mode)r    r+   r   )telegramr   r#   r   
startswith
ValueErrorr   r(   absoluteas_uriopenr   r"   r   r   Zfile_id)r)   r*   r    r+   r,   r   r'   r   r   r   parse_file_input`   s&    )

r5   )NNFF)__doc__pathlibr   typingr   r   r   r   r   r   r	   r
   r   r   Ztelegram._utils.typesr   r   r/   r   r   r   r   r   r   r   boolr(   r5   r   r   r   r   <module>   s6   0"
    

