o
    ,wi_                     @   s   d Z ddlZddlmZmZmZ ddlmZ ddlmZ dd Z	dd	 Z
d
d Zdd Zeje
eedZG dd dejZeddZ	ddededefddZdS )z4Utilities for traversing and converting dataclasses.    N)AnyOptionalType)config)daglishc                 C   s   dd t | D S )Nc                 S   s   g | ]}|j qS  )name.0fieldr   r   a/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/fiddle/_src/experimental/dataclasses.py
<listcomp>   s    z_names.<locals>.<listcomp>)dataclassesfields)value_or_typer   r   r   _names   s   r   c                    s&   t  } fdd|D t |ffS )Nc                    s   g | ]}t  |qS r   )getattrr
   r   valuer   r   r          z&_flatten_dataclass.<locals>.<listcomp>)r   type)r   namesr   r   r   _flatten_dataclass   s   r   c                 C   s>   |\}}t |t | ksJ dd t|| D }|di |S )Nc                 S   s   i | ]\}}||qS r   r   )r
   r   r   r   r   r   
<dictcomp>%   r   z(_unflatten_dataclass.<locals>.<dictcomp>r   )lenzip)valuesmetadatatypr   values_dictr   r   r   _unflatten_dataclass"   s   r!   c                 C   s   t dd t| D S )Nc                 s   s    | ]}t |V  qd S N)r   Attrr   r   r   r   	<genexpr>*   s    z$_path_elements_fn.<locals>.<genexpr>)tupler   r   r   r   r   _path_elements_fn)   s   r&   )flatten	unflattenpath_elementsc                   @   s(   e Zd Zdee deej fddZdS )DataclassTraverserRegistry	node_typereturnc                 C   s&   | j |}|d u rt|rt}|S r"   )fallback_registryfind_node_traverserr   is_dataclassdataclass_traverser)selfr+   	traverserr   r   r   r.   6   s   z.DataclassTraverserRegistry.find_node_traverserN)	__name__
__module____qualname__r   r   r   r   NodeTraverserr.   r   r   r   r   r*   4   s    r*   T)use_fallbackFrootallow_post_initr,   c                    s0   dt jf fdd}t || t }|| |S )a  Converts a dataclass or nested structure of dataclasses to Fiddle configs.

  Args:
    root: Root dataclass instance or structure (lists, tuples, dicts, etc.) of
      dataclasses.
    allow_post_init: Allow conversion of dataclasses with a __post_init__
      method.

  Returns:
    Fiddle config that, when built, should return an object equal to `root`
    (presuming `root` does not already contain Fiddle configs).
  statec                    sb   t  r,t ts,tt drstdtjt fi  fddt  D  |	 S )N__post_init__zVDataclasses with __post_init__ are not allowed, unless allow_post_init is set to True.c                    s"   i | ]}|j r|jt |jqS r   )initr   r   r	   r   r   r   r   [   s    zDconvert_dataclasses_to_configs.<locals>.traverse.<locals>.<dictcomp>)
r   r/   
isinstancer   hasattr
ValueErrorr   Configr   map_children)r   r:   r9   r   r   traverseR   s   

z0convert_dataclasses_to_configs.<locals>.traverse)r   StateMemoizedTraversaldaglish_dataclass_registryinitial_state)r8   r9   rC   r:   r   rB   r   convert_dataclasses_to_configsB   s   
rH   )F)__doc__r   typingr   r   r   fiddle._srcr   r   r   r   r!   r&   r6   r0   NodeTraverserRegistryr*   rF   boolrH   r   r   r   r   <module>   s0   
