
    i\	                         d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZ  G d de      Z ed       G d	 d
             Z G d d      Zy)z<Generic registry utilities for pluggable backend components.    )	dataclassfield)import_module)AnyCallableDictIterableOptionalc                       e Zd ZdZy)RegistryErrorz6Raised when registering duplicated or invalid entries.N)__name__
__module____qualname____doc__     ;/Users/bowang/.openclaw/workspace/ChatDev/utils/registry.pyr   r      s    @r   r   T)slotsc                   ^    e Zd ZU eed<   eg ef   ed<    ee      Z	e
eef   ed<   defdZy)RegistryEntrynameloader)default_factorymetadatareturnc                 "    | j                         S N)r   selfs    r   loadzRegistryEntry.load   s    {{}r   N)r   r   r   str__annotations__r   r   r   dictr   r   r    r   r   r   r   r      s9    
IRW$T:Hd38n:c r   r   c                       e Zd ZdZdeddfdZdddddddedeg ef   dz  d	edz  d
ee	eef      dedz  dedz  ddfdZ
dedefdZdee   fdZdeeeef      fdZdede	eef   fdZy)Registryz6Lightweight registry with lazy module loading support.	namespacer   Nc                      || _         i | _        y r   )r&   _entries)r   r&   s     r   __init__zRegistry.__init__   s    "24r   )r   targetr   module_path	attr_namer   r   r*   r   r+   r,   c                ,   || j                   v rt        d| d| j                         |?||t        d      ||fd}n(|st        d      ||fdt        dt        dt        fd	}|}t        ||t        |xs i       
      }|| j                   |<   y )NzDuplicate registration for '' in z5Must provide loader, target, or module_path/attr_namec                     | S r   r   )r*   s    r   <lambda>z#Registry.register.<locals>.<lambda>.   s    vr   zmodule_path requires attr_namemod_pathattrr   c                 0    t        |       }t        ||      S r   )r   getattr)r1   r2   modules      r   _lazy_loaderz'Registry.register.<locals>._lazy_loader3   s    *84F"6400r   )r   r   r   )r(   r   r&   r!   r   r   r#   )	r   r   r   r*   r   r+   r,   r6   entrys	            r   registerzRegistry.register   s     4== ">tfE$..IY Z[[>~+"5#$[\\!'-5 '(HII1<) 13 1C 1X[ 1 &4hnRTAUV#dr   c                 |    	 | j                   |   S # t        $ r!}t        d| d| j                         |d }~ww xY w)NzUnknown entry 'r.   )r(   KeyErrorr   r&   )r   r   excs      r   getzRegistry.get<   sI    	X==&& 	X/$uT^^<L MNTWW	Xs    	;6;c                 6    | j                   j                         S r   )r(   keysr   s    r   nameszRegistry.namesB   s    }}!!##r   c                 6    | j                   j                         S r   )r(   itemsr   s    r   rA   zRegistry.itemsE   s    }}""$$r   c                 J    t        | j                  |      j                        S r   )r#   r<   r   )r   r   s     r   metadata_forzRegistry.metadata_forH   s    DHHTN++,,r   )r   r   r   r   r!   r)   r   r   r
   r   r8   r   r<   r	   r?   tuplerA   rC   r   r   r   r%   r%      s    @5# 5$ 5 ,0!-1"& $$$ S!D(	$
 d
$ 4S>*$ 4Z$ :$ 
$>X X X$x} $%xc=&8 9: %- -c3h -r   r%   N)r   dataclassesr   r   	importlibr   typingr   r   r   r	   r
   RuntimeErrorr   r   r%   r   r   r   <module>rI      sJ    B ( # : :AL A   3- 3-r   