o
    @j                     @   s   d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
mZ d dlmZ ddlmZ er8d dlmZ ddlmZ G dd	 d	ZG d
d dZG dd deZdS )    N)	AnyCallableDict	GeneratorListTYPE_CHECKINGTypeUnioncast)FluentParser   )FluentBundle)Resource)
FluentTypec                   @   s   e Zd ZdZdedfdee dee ddded	ee d
e	e
eeegdf f df fddZddede	e
eef df defddZdee defddZdeeddf fddZdeeddf fddZdS )FluentLocalizationz
    Generic API for Fluent applications.

    This handles language fallback, bundle creation and string localization.
    It uses the given resource loader to load and parse Fluent data.
    FNlocalesresource_idsresource_loaderAbstractResourceLoaderuse_isolatingbundle_class	functionsr   c                 C   s8   || _ || _|| _|| _|| _|| _g | _|  | _d S N)	r   r   r   r   r   r   _bundle_cache_iterate_bundles
_bundle_it)selfr   r   r   r   r   r    r   f/var/www/www-root/data/www/ai-bot.pdev.uz/venv/lib/python3.10/site-packages/fluent/runtime/fallback.py__init__   s   	zFluentLocalization.__init__msg_idargsreturnc                 C   sN   |   D ] }||sq||}|jsq||j|\}}tt|  S |S r   )_bundleshas_messageget_messagevalueformat_patternr
   str)r   r    r!   bundlemsgval_errorsr   r   r   format_value(   s   

zFluentLocalization.format_valuec                 C   s   | j || j| jdS )N)r   r   )r   r   r   )r   r   r   r   r   _create_bundle3   s   
z!FluentLocalization._create_bundlec                 c   sX    d}	 |t | jkr!z| jt| j W n
 ty    Y d S w | j| V  |d7 }q)Nr   Tr   )lenr   appendnextr   StopIteration)r   bundle_pointerr   r   r   r#   8   s   zFluentLocalization._bundlesc                 c   sh    t dt| jD ](}| j|d  }| j|d | jD ]}| |}|D ]}|| q%|V  qq	d S )Nr   )ranger/   r   r   	resourcesr   r.   add_resource)r   	first_loclocsr5   r)   resourcer   r   r   r   C   s   
z#FluentLocalization._iterate_bundlesr   )__name__
__module____qualname____doc__r   r   r(   boolr   r	   r   r   r   r   r-   r.   r   r#   r   r   r   r   r   r      s,    
(r   c                	   @   s8   e Zd ZdZdedee deed ddf fddZdS )	r   z6
    Interface to implement for resource loaders.
    localer   r"   r   Nc                 C   s   t )a!  
        Yield lists of FluentResource objects, corresponding to
        each of the resource_ids.
        If there are multiple locations, this may yield multiple lists.
        If a resource isn't found in any location, yield a partial list,
        but don't yield empty lists.
        )NotImplementedError)r   r?   r   r   r   r   r5   R   s   z AbstractResourceLoader.resources)r:   r;   r<   r=   r(   r   r   r5   r   r   r   r   r   M   s    ,r   c                	   @   sh   e Zd ZdZdeeee f fddZdedee deed d	d	f fd
dZ	dededefddZ
d	S )FluentResourceLoadera;  
    Resource loader to read Fluent files from disk.

    Different locales are in different locations based on locale code.
    The locale code should be encoded as `{locale}` in the roots, or in
    the resource_ids.
    This loader does not support loading resources for one bundle from
    different roots.
    rootsc                 C   s    t |tr|g| _dS || _dS )z
        Create a resource loader. The roots may be a string for a single
        location on disk, or a list of strings.
        N)
isinstancer(   rB   )r   rB   r   r   r   r   h   s    zFluentResourceLoader.__init__r?   r   r"   r   Nc                 c   sr    | j D ]2}g }|D ]&}| tj|||}tj|sq
t|dd }|	t
 | q
|r6|V  qd S )Nrzutf-8)rB   localize_pathospathjoinisfilecodecsopenreadr0   r   parse)r   r?   r   rootr5   resource_idrG   contentr   r   r   r5   o   s   
zFluentResourceLoader.resourcesrG   c                 C   s   |j |dS )N)r?   )format)r   rG   r?   r   r   r   rE   {   s   z"FluentResourceLoader.localize_path)r:   r;   r<   r=   r	   r(   r   r   r   r5   rE   r   r   r   r   rA   ]   s
    
(rA   )rJ   rF   typingr   r   r   r   r   r   r   r	   r
   fluent.syntaxr   r)   r   fluent.syntax.astr   typesr   r   r   rA   r   r   r   r   <module>   s    ,?