a
    [h                     @   s<   d dl Z d dlmZmZmZmZmZ G dd dZe ZdS )    N)DictAnyOptionalUnionListc                   @   s   e Zd ZddddZeddddZdddd	Zeeeef d
ddZ	d eee
e e
e edddZd!eeeeef  e
e eedddZd"ee
e edddZeedddZeedddZeeeddddZddddZdS )#ConfigHandlerN)returnc                 C   s   d | _ i | _d S N)config_pathconfig)self r   ,   /var/aqua_controller/core/сonfig_handler.py__init__
   s    zConfigHandler.__init__)config_file_namer   c                 C   s
   || _ d S r	   )r
   )r   r   r   r   r   set_config_file   s    zConfigHandler.set_config_filec              
   C   s   zDt | jddd }t|p i | _W d    n1 s80    Y  W nV tyh   td| j dY n4 tjy } ztd| W Y d }~n
d }~0 0 d S )Nrutf-8encodingu#   файл конфигурации 'u   ' не найденu$   ошибка парсинга YAML: )openr
   yamlZ	safe_loadr   FileNotFoundError
ValueErrorZ	YAMLErrorr   fer   r   r   load_config   s    2zConfigHandler.load_config)sectionr   c                 C   s$   || j vrtd| d| j | S )Nu   cекция [u1   ] не найдена в конфигурации)r   r   )r   r   r   r   r   get_section    s    
zConfigHandler.get_section)r   key
value_typedefaultr   c                 C   s8   || j vr|S | |}||vr$|S || }| ||S r	   )r   r   _convert_value)r   r   r    r!   r"   Zsection_data	raw_valuer   r   r   	get_value+   s    

zConfigHandler.get_value)r   key_pathr!   r"   r   c              
   C   sz   zX|  |}|D ]:}t|tr(|| }qt|tr@|t| }q|  W S q| ||W S  tttfyt   | Y S 0 d S r	   )	r   
isinstancedictlistintr#   KeyError
IndexErrorr   )r   r   r&   r!   r"   currentr    r   r   r   get_nested_value<   s    



zConfigHandler.get_nested_value)r$   r!   r   c              
   C   s   z|d u r|W S t ||r |W S |tkr2t|W S |tkrDt|W S |tkrX| |W S |tkrl| |W S |tkr~t|W S td| dW n6 t	tfy } zt	d| W Y d }~n
d }~0 0 d S )Nu   тип uF    не поддерживается для преобразованияu<   ошибка преобразования значения: )
r'   r*   floatbool_parse_boolr)   _parse_listr(   	TypeErrorr   )r   r$   r!   r   r   r   r   r#   N   s$    



zConfigHandler._convert_value)valuer   c                 C   s,   t |tr|S t |tr$| dv S t|S )N)trueZyesy1Zon)r'   r0   strlowerr   r4   r   r   r   r1   d   s
    

zConfigHandler._parse_boolc                 C   s2   t |tr|S t |tr,dd |dD S |gS )Nc                 S   s   g | ]}|  r|  qS r   )strip).0itemr   r   r   
<listcomp>p       z-ConfigHandler._parse_list.<locals>.<listcomp>,)r'   r)   r8   splitr:   r   r   r   r2   l   s
    

zConfigHandler._parse_list)r   r    r4   r   c                 C   s&   || j vri | j |< || j | |< d S r	   )r   )r   r   r    r4   r   r   r   update_valuew   s    

zConfigHandler.update_valuec              
   C   s   zJt | jddd&}tj| j|dddd W d    n1 s>0    Y  W n2 ty| } ztd| W Y d }~n
d }~0 0 d S )Nwr   r   TF)Zallow_unicodeZdefault_flow_styleZ	sort_keysu<   ошибка сохранения конфигурации: )r   r
   r   dumpr   	Exceptionr   r   r   r   r   save_config~   s
    8zConfigHandler.save_config)NN)NN)N)__name__
__module____qualname__r   r8   r   r   r   r   r   r   typer%   r   r   r*   r.   r#   r0   r1   r)   r2   rB   rF   r   r   r   r   r      s    (r   )	r   typingr   r   r   r   r   r   r   r   r   r   r   <module>   s   ~