o
    ;i                     @   s   d dl mZmZmZmZmZ d dlmZ d dlm	Z	 d dl
mZ ddlmZ ddlmZ ddlmZ d	d
lmZmZ d	dlmZmZ d	dlmZmZ d	dlmZ d	dlmZ d	dlmZ erdddlm Z  G dd deZdS )    )TYPE_CHECKINGAny
CollectionListOptional)FileDescriptor)FileDescriptorProto)Default   )Status)_service_name)Stream   )ServerReflectionRequestServerReflectionResponse)ErrorResponseListServiceResponse)ServiceResponseExtensionNumberResponse)FileDescriptorResponse)ServerReflectionBase)ServerReflection)	IServablec                   @   s   e Zd ZdZdddee dee fddZde	fd	d
Z
dede	fddZdede	fddZdede	fddZdedede	fddZdede	fddZde	fddZdeee	f ddfddZedd d!d"d#ee dd$fd%d&ZdS )'r   z0
    Implements server reflection protocol.
    N)_pool_service_namesr   c                C   s   || _ |pt | _d S N)r   r	   r   )selfr   r    r   N/home/ubuntu/.local/lib/python3.10/site-packages/grpclib/reflection/service.py__init__,   s   zServerReflection.__init__returnc                 C   s   t ttjjdddS )Nz	not found
error_codeerror_messageerror_response)r   r   r   	NOT_FOUNDvaluer   r   r   r   _not_found_response5   s   z$ServerReflection._not_found_responsefile_descriptorc                 C   s&   t  }|| tt| gddS )N)file_descriptor_proto)file_descriptor_response)r   CopyToProtor   r   SerializeToString)r   r*   protor   r   r   _file_descriptor_response=   s   
z*ServerReflection._file_descriptor_response	file_namec                 C   6   z| j |}W n ty   |   Y S w | |S r   )r   FindFileByNameKeyErrorr)   r0   )r   r1   filer   r   r   _file_by_filename_responseI      
z+ServerReflection._file_by_filename_responsesymbolc                 C   r2   r   )r   FindFileContainingSymbolr4   r)   r0   )r   r8   r5   r   r   r    _file_containing_symbol_responseT   r7   z1ServerReflection._file_containing_symbol_responsemsg_name
ext_numberc                 C   sR   z| j |}| j ||}| j |j}W n ty#   |   Y S w | |S r   )r   FindMessageTypeByNameFindExtensionByNumberr9   	full_namer4   r)   r0   )r   r;   r<   message	extensionr5   r   r   r   #_file_containing_extension_response_   s   
z4ServerReflection._file_containing_extension_response	type_namec                 C   sV   z| j |}| j |}W n ty   |   Y S w tt|jdd |D ddS )Nc                 S   s   g | ]}|j qS r   )number).0extr   r   r   
<listcomp>z   s    zLServerReflection._all_extension_numbers_of_type_response.<locals>.<listcomp>)base_type_nameextension_number)all_extension_numbers_response)r   r=   FindAllExtensionsr4   r)   r   r   r?   )r   rC   r@   
extensionsr   r   r   '_all_extension_numbers_of_type_responsem   s   z8ServerReflection._all_extension_numbers_of_type_responsec                 C   s   t tdd | jD ddS )Nc                 S   s   g | ]}t |d qS ))name)r   )rE   service_namer   r   r   rG      s    z<ServerReflection._list_services_response.<locals>.<listcomp>)service)list_services_response)r   r   r   r(   r   r   r   _list_services_response~   s   z(ServerReflection._list_services_responsestreamc                    s   |2 zW3 d H W }| dr| |j}n=| dr!| |j}n1| dr1| |jj|jj}n!| dr=| 	|j
}n| drG|  }ntttjjddd}||I d H  q6 d S )	Nfile_by_filenamefile_containing_symbolfile_containing_extensionall_extension_numbers_of_typelist_serviceszinvalid argumentr!   r$   )HasFieldr6   rT   r:   rU   rB   rV   containing_typerI   rM   rW   rR   r   r   r   INVALID_ARGUMENTr'   send_message)r   rS   requestresponser   r   r   ServerReflectionInfo   s:   





z%ServerReflection.ServerReflectionInfo)poolserviceszCollection[IServable]r`   zList[IServable]c                C   sL   g }|D ]	}| t| qt|}| | ||d | t||d |S )a|  
        Extends services list with reflection service:

        .. code-block:: python3

            from grpclib.reflection.service import ServerReflection

            services = [Greeter()]
            services = ServerReflection.extend(services)

            server = Server(services)
            ...

        Returns new services list with reflection support added.
        )r   r   )appendr   list_ServerReflectionV1Alpha)clsra   r`   service_namesrP   r   r   r   extend   s   
zServerReflection.extend)__name__
__module____qualname____doc__r   strr   r   r   r   r)   r   r0   r6   r:   intrB   rM   rR   r   r   r_   classmethodrg   r   r   r   r   r   (   sf    
	






!r   N)!typingr   r   r   r   r   google.protobuf.descriptorr   google.protobuf.descriptor_pb2r   google.protobuf.descriptor_poolr	   constr   utilsr   serverr   v1.reflection_pb2r   r   r   r   r   r   r   v1.reflection_grpcr   _deprecatedr   rd   _typingr   r   r   r   r   <module>   s    