
    :jm                         d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
  e
d      Z G d d      Zd	ed
ee   ddfdZd	edee   defdZdee   fdZy)zt
Global provider registry for dynamic provider management.
Enables plugin-style provider registration and creation.
    )DictListType)	Condition)	IProvider)
get_loggerregistryc                       e Zd ZU dZi Zeeee   f   e	d<   e
dedee   ddfd       Ze
dedee   defd	       Ze
dedefd
       Ze
dee   fd       Ze
dd       Zy)ProviderRegistryz/Global registry for provider types and creation	_registryprovider_typeprovider_classreturnNc                     |st        d      t        |t              st        d      || j                  |j	                         <   t
        j                  d| d|j                          y)zRegister a provider class for a given type

        Args:
            provider_type: Provider type identifier
            provider_class: Provider class to register
        zProvider type cannot be emptyz3Provider class must inherit from Provider interfacezRegistered provider: z -> N)
ValueError
issubclassr   r   lowerloggerdebug__name__)clsr   r   s      ?/root/.openclaw/workspace/harvester/search/provider/registry.pyregisterzProviderRegistry.register   sa     <==.)4RTT/=m))+,,]O4@W@W?XYZ    
conditionsc                 4   |j                         }|| j                  vr4t        | j                  j                               }t	        d| d|       | j                  |   }	  |dd|i|S # t
        $ r!}t        j                  d| d|         d}~ww xY w)ar  Create provider instance by type

        Args:
            provider_type: Provider type identifier
            conditions: Search conditions for provider
            **kwargs: Additional provider-specific parameters

        Returns:
            Provider: Configured provider instance

        Raises:
            ValueError: If provider type is not registered
        zUnknown provider type: z. Available: r   zFailed to create provider z: N )r   r   listkeysr   	Exceptionr   error)r   r   r   kwargs	availabler   es          r   createzProviderRegistry.create'   s     &++--S]]//12I6}o]S\R]^__}5	!BZB6BB 	LL5m_BqcJK	s   #	A- -	B6BBc                 :    |j                         | j                  v S )zCheck if provider type is registered

        Args:
            provider_type: Provider type to check

        Returns:
            bool: True if provider type is registered
        )r   r   )r   r   s     r   is_registeredzProviderRegistry.is_registeredE   s     ""$55r   c                 H    t        | j                  j                               S )z~Get list of registered provider types

        Returns:
            List[str]: List of registered provider type names
        )r   r   r   r   s    r   get_registered_typesz%ProviderRegistry.get_registered_typesQ   s     CMM&&())r   c                 b    | j                   j                          t        j                  d       y)z3Clear all registered providers (mainly for testing)zCleared provider registryN)r   clearr   r   r)   s    r   r,   zProviderRegistry.clearZ   s!     	01r   )r   N)r   
__module____qualname____doc__r   r   strr   r   __annotations__classmethodr   r   r   r%   boolr'   r*   r,   r   r   r   r   r      s    9,.ItCi().[S [$y/ [d [ [  3 DO R[  : 	6# 	6$ 	6 	6 *T#Y * * 2 2r   r   r   r   r   Nc                 0    t         j                  | |       y)zRegister a provider class

    Args:
        provider_type: Provider type identifier
        provider_class: Provider class to register
    N)r   r   )r   r   s     r   register_providerr5   b   s     m^<r   r   c                 0    t        j                  | |fi |S )a  Create provider instance

    Args:
        provider_type: Provider type identifier
        conditions: Search conditions for provider
        **kwargs: Additional provider-specific parameters

    Returns:
        Provider: Configured provider instance
    )r   r%   )r   r   r"   s      r   create_providerr7   l   s     ""=*GGGr   c                  *    t         j                         S )zpGet list of available provider types

    Returns:
        List[str]: List of available provider type names
    )r   r*   r   r   r   get_available_providersr9   z   s     0022r   )r/   typingr   r   r   core.modelsr   
core.typesr   tools.loggerr   r   r   r0   r5   r7   r9   r   r   r   <module>r>      s   
 $ # !   #	J	M2 M2b=S =$y/ =d =H3 HDO HR[ H3c 3r   