
    h                         S r SSKJr  SSKrSSKrSSKrSSKJrJrJ	r	J
r
JrJrJrJr  \(       a  SSKrSSKJrJr  SSKJr  SSKJr  S	rS
rSr\" S5      r S     SS jjrSS jrSS jr      SS jrSS jrg)z@Type-safe, human-readable serialization helpers for dataclasses.    )annotationsN)IOTYPE_CHECKINGAnyOptionalSetTypeTypeVarUnion)get_args
get_origin   )	_resolverMISSINGz!enum:z!dataclass:z!missingDataclassTypec                  ^^^ [         R                  " U 5      (       d   eUc
  [        5       OUm[         R                  " U 5      n [         R                  " U 5      u  pU 1mSUUU4S jjmUR                  5        H  nTT" U5      -  mM     U T;   a  T$ [         R                  " U 5       H9  n[        UR                  [        5      (       a   eTT" UR                  5      -  mM;     U R                  5        H  nTT" U5      -  mM     T$ )zXTakes a dataclass type, and recursively searches its fields for dataclass or enum
types.c           	     &  > [         R                  " U 5      (       a  U T;  a  [        U TT-  S9$ [        U [        R
                  5      (       a  U 1$ [        R                  " [        R                  [        T[        U 5      5      [        5       5      $ )N)_parent_contained_dataclasses)r   is_dataclass&_get_contained_special_types_from_type
isinstanceenumEnumMeta	functoolsreducesetunionmapr   )typcontained_special_typeshandle_typeparent_contained_dataclassess    T/home/james-whalen/.local/lib/python3.13/site-packages/tyro/extras/_serialization.pyr"   ;_get_contained_special_types_from_type.<locals>.handle_type,   sy    !!#&&36R+R9.E.//  T]]++5L 		3{HSM+JCERR    )r    	Type[Any]returnSet[Type[Any]])r   r   r   unwrap_annotatedresolve_generic_typesvaluesresolved_fieldsr   typestr__subclasses__)	clsr   type_from_typevarr    fieldsubclassr!   r"   r#   s	         @@@r$   r   r      s    !!#&&&& )0 	* ! 
$
$S
)C&<<SAC"eS S" !'');s#33 * **&& **3/ejj#....;uzz#:: 0
 &&(;x#88 ) #"r&   c                8   SS K n " S SUR                  5      n[        [        U 5      5      n[        [	        S U5      5      n[        [        U5      5      [        U5      :X  d
   SU 35       eS
S jnSS jn[        X45       H}  u  px[        R                  " U5      (       a  UR                  [        U-   U" U5      S9  M?  [        U[        R                  5      (       a  UR                  [        U-   U" U5      S9  M}   e   UR                  [         S	 S9  U$ )Nr   c                      \ rS rSrSrg)%_make_loader.<locals>.DataclassLoaderR    N)__name__
__module____qualname____firstlineno____static_attributes__r9   r&   r$   DataclassLoaderr7   R   s    r&   r?   c                    U R                   $ Nr:   r1   s    r$   <lambda>_make_loader.<locals>.<lambda>^       r&   z;Contained dataclass type names must all be unique, but got c                   ^  U 4S j$ )Nc                2   > T" S0 U R                  U5      D6$ )Nr9   )construct_mappingloadernoder    s     r$   rD   B_make_loader.<locals>.make_dataclass_constructor.<locals>.<lambda>e   s    C$I&*B*B4*H$Ir&   r9   r    s   `r$   make_dataclass_constructor0_make_loader.<locals>.make_dataclass_constructord   s	    IIr&   c                   ^  U 4S j$ )Nc                ,   > TU R                  U5         $ rA   )construct_python_strrJ   s     r$   rD   =_make_loader.<locals>.make_enum_constructor.<locals>.<lambda>h   s    C(C(CD(I$Jr&   r9   rN   s   `r$   make_enum_constructor+_make_loader.<locals>.make_enum_constructorg   s	    JJr&   )tagconstructorc                     [         $ rA   r   )_unuseds    r$   rD   rE   z   s    Wr&   )r    r'   )r    zType[enum.Enum])yamlLoaderlistr   r   lenr   zipdataclassesr   add_constructorDATACLASS_YAML_TAG_PREFIX
issubclassr   EnumENUM_YAML_TAG_PREFIXMISSING_YAML_TAG_PREFIX)	r1   r[   r?   contained_typescontained_type_namesrO   rU   r    names	            r$   _make_loaderrj   O   s$   $++  A#FGO$<o NOs'()S1E-FF 	 !	#F
JK ?	##C((++-46s; ,  TYY''++(4/1#6 , 
 5 @ ###, $ 
 r&   c                   SS K n " S SUR                  5      n[        [        [	        U 5      5      5      n[        [        S U5      5      n[        [        U5      5      [        U5      :X  d
   SU 35       eSS jn[        X45       H  u  pgUR                  Xe" U5      5        M     UR                  [	        [        5      S 5        U$ )	Nr   c                  (   ^  \ rS rSrU 4S jrSrU =r$ )%_make_dumper.<locals>.DataclassDumper   c                @   > [         TU ]  U5      =(       d    U[        L $ rA   )superignore_aliasesr   )selfdata	__class__s     r$   rq   4_make_dumper.<locals>.DataclassDumper.ignore_aliases   s    7)$/B47?Br&   r9   )r:   r;   r<   r=   rq   r>   __classcell__)rt   s   @r$   DataclassDumperrm      s    	C 	Cr&   rw   c                    U R                   $ rA   rB   rC   s    r$   rD   _make_dumper.<locals>.<lambda>   rF   r&   z;Contained dataclass/enum names must all be unique, but got c                   ^  SU 4S jjnU$ )Nc                  > [         R                  " U5      (       am  U R                  [        T-   [         R                  " U5       Vs0 s H6  nUR
                  (       d  M  UR                  [        XR                  5      _M8     snS9$ [        U[        R                  5      (       a!  U R                  [        T-   UR                  S9$  es  snf )N)rW   mappingrW   value)r`   r   represent_mappingrb   fieldsinitri   getattrr   r   rd   represent_scalarre   )dumperrs   r3   ri   s      r$   representer;_make_dumper.<locals>.make_representer.<locals>.representer   s    ''--//1D8 &1%7%7%=%=E :: >

GD**$==%= 0   D$)),,..,t3499 /   5s   C
!$C
)r   rw   rs   r   r(   z	yaml.Noder9   )ri   r   s   ` r$   make_representer&_make_dumper.<locals>.make_representer   s    	  r&   c                *    U R                  [        SS9$ )N r}   )r   rf   )r   rs   s     r$   rD   ry      s    V44'r 5 
r&   )ri   r/   )r[   Dumperr]   r   r.   r   r^   r   r_   add_representerr   )instancer[   rw   rg   rh   r   r    ri   s           r$   _make_dumperr      s    C$++ C A$x.QRO$<o NO s'()S1E-FF 	 !	#F
& ?	''-=d-CD @ ##W	
 r&   c                    SSK nUR                  " U[        U 5      S9n[        U 5      n[	        X4b  UOU 5      (       d   eU$ )u  Re-construct a dataclass instance from a yaml-compatible string, which should be
generated from :func:`tyro.extras.to_yaml()`.

.. warning::

    **Deprecated.** Serialization functionality is stable but deprecated.
    It may be removed in a future version of :code:`tyro`.

As a secondary feature aimed at enabling the use of :func:`tyro.cli` for general
configuration use cases, we also introduce functions for human-readable dataclass
serialization: :func:`tyro.extras.from_yaml` and :func:`tyro.extras.to_yaml` attempt
to strike a balance between flexibility and robustness — in contrast to naively
dumping or loading dataclass instances (via pickle, PyYAML, etc), explicit type
references enable custom tags that are robust against code reorganization and
refactor, while a PyYAML backend enables serialization of arbitrary Python objects.

Args:
    cls: Type to reconstruct.
    stream: YAML to read from.

Returns:
    Instantiated dataclass.
r   N)r\   )r[   loadrj   r   r   )r1   streamr[   out
origin_clss        r$   	from_yamlr      sB    6 
))F<#4
5CCJc)?:SIIIIJr&   c                D    SSK nSUR                  " U [        U 5      S9-   $ )u  Serialize a dataclass; returns a yaml-compatible string that can be deserialized
via :func:`tyro.extras.from_yaml()`.

.. warning::

    **Deprecated.** Serialization functionality is stable but deprecated.
    It may be removed in a future version of :code:`tyro`.

As a secondary feature aimed at enabling the use of :func:`tyro.cli` for general
configuration use cases, we also introduce functions for human-readable dataclass
serialization: :func:`tyro.extras.from_yaml` and :func:`tyro.extras.to_yaml` attempt
to strike a balance between flexibility and robustness — in contrast to naively
dumping or loading dataclass instances (via pickle, PyYAML, etc), explicit type
references enable custom tags that are robust against code reorganization and
refactor, while a PyYAML backend enables serialization of arbitrary Python objects.

Args:
    instance: Dataclass instance to serialize.

Returns:
    YAML string.
r   Nz# tyro YAML.
)r   )r[   dumpr   )r   r[   s     r$   to_yamlr      s"    . diih9OPPPr&   rA   )r1   r'   r   zOptional[Set[Type[Any]]]r(   r)   )r1   r'   r(   zType[yaml.Loader])r   r   r(   zType[yaml.Dumper])r1   zType[DataclassType]r   z%Union[str, IO[str], bytes, IO[bytes]]r(   r   )r   r   r(   r/   ) __doc__
__future__r   r`   r   r   typingr   r   r   r   r   r	   r
   r   r[   typing_extensionsr   r   r   r   constructors._struct_specr   re   rb   rf   r   r   rj   r   r   r   r9   r&   r$   <module>r      s    F "    N N N 2  / ) $ (
 ?C2#	2##;2# 2#j.b,^ 	 1   FQr&   