a
    ij                     @  s   d Z ddlmZ ddlZddlZddlmZmZmZmZm	Z	m
Z
 eZeZeZe
dZe
dZdddd	d
dddZG dd deeef ZddddddZdddddddZdddddZdS )zField utils.    )annotationsN)AnyCallableGenericOptionalTypeTypeVar_InT_OutT)validatez Optional[Callable[[_In], _OutT]]r   zdataclasses.Field[_OutT])r   kwargsreturnc                 K  s6   | du rt jf i |S t| |d}tt j|S dS )zLike `dataclasses.field`, but allow `validator`.

  Args:
    validate: A callable `(x) -> x` called each time the variable is assigned.
    **kwargs: Kwargs forwarded to `dataclasses.field`

  Returns:
    The field.
  N)r   field_kwargs)dataclassesfield_FieldtypingcastField)r   r   Zfield_ r   S/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/edc/field_utils.pyr      s    r   c                   @  sZ   e Zd ZdZddddddZdd	dd
ddZdddddddZddddddZdS )r   zField descriptor.zCallable[[_InT], _OutT]zdict[str, Any]None)r   r   r   c                 C  s"   d| _ d| _|| _|| _d| _dS )zConstructor.

    Args:
      validate: A callable called each time the variable is assigned.
      field_kwargs: Kwargs forwarded to `dataclasses.field`
    NT)_attribute_name_objtype	_validate_field_kwargs_first_getattr_call)selfr   r   r   r   r   __init__6   s
    z_Field.__init__zType[_Dataclass]str)objtypenamer   c                 C  s   || _ || _dS )z+Bind the descriptor to the class (PEP 487).N)r   r   )r   r    r!   r   r   r   __set_name__N   s    z_Field.__set_name__NzOptional[_Dataclass]zOptional[Type[_Dataclass]]r
   )objr    r   c                 C  s<   |du r,| j r&d| _ tjf i | jS | S nt|| jS dS )z0Called when `MyDataclass.x` or `my_dataclass.x`.NF)r   r   r   r   _getattrr   )r   r#   r    r   r   r   __get__S   s    
z_Field.__get__
_Dataclassr	   )r#   valuer   c                 C  s   t || j| | dS )z#Called as `my_dataclass.x = value`.N)_setattrr   r   )r   r#   r'   r   r   r   __set__q   s    z_Field.__set__)N)__name__
__module____qualname____doc__r   r"   r%   r)   r   r   r   r   r   3   s    r   r&   r   _Out)r#   attribute_namer   c                 C  s>   t |  || jvr0tdt| j d| dn
| j| S dS )z!Returns the `obj.attribute_name`.ztype object 'z' has no attribute ''N)_init_dataclass_state_dataclass_field_valuesAttributeErrortyper,   )r#   r/   r   r   r   r$   }   s    
r$   _Inr   )r#   r/   r'   r   c                 C  s   t |  || j|< dS )z%Set the `obj.attribute_name = value`.N)r1   r2   )r#   r/   r'   r   r   r   r(      s    	r(   )r#   r   c                 C  s   t | dst| di  dS )zAInitialize the object state containing all DataclassField values.r2   N)hasattrobject__setattr__)r#   r   r   r   r1      s    
r1   )r-   
__future__r   r   r   r   r   r   r   r   r   r&   r5   r.   r	   r
   r   r   r$   r(   r1   r   r   r   r   <module>   s    J