o
    b                     @   s   d Z ddl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mZmZ ddlmZ G dd dZdS )z
Run a Twisted application.
    N)Sequence)_exitWithSignal)IReactorCore_ISupportsExitSignalCapturing)Options
UsageError   )
ExitStatusexit)Runner)ApplicationIServiceIServiceMaker   )TwistOptionsc                   @   s   e Zd ZdZedee defddZede	de
defdd	Zed
ededdfddZededdfddZeejfdee ddfddZdS )Twistz$
    Run a Twisted application.
    argvreturnc              
   C   s^   t  }z|| dd  W |S  ty. } zttjd| d|  W Y d}~|S d}~ww )z
        Parse command line options.

        @param argv: Command line arguments.
        @return: The parsed options.
        r   NzError: z

)r   parseOptionsr   r
   r	   EX_USAGE)r   optionse r   B/usr/lib/python3/dist-packages/twisted/application/twist/_twist.pyr      s   "zTwist.optionspluginr   c                 C   s&   |  |}t| j}|| t|S )a
  
        Create the application service.

        @param plugin: The name of the plugin that implements the service
            application to run.
        @param options: Options to pass to the application.
        @return: The created application service.
        )makeServicer   tapnamesetServiceParentr   )r   r   serviceapplicationr   r   r   r   +   s   



zTwist.servicereactorr   Nc                 C   s   |   | dd|j dS )z
        Start the application service.

        @param reactor: The reactor to run the service with.
        @param service: The application service to run.
        beforeshutdownN)startServiceaddSystemEventTriggerstopService)r    r   r   r   r   r#   ;   s   zTwist.startServicetwistOptionsc                 C   sZ   t | d | d | d | d d}|  | d }t|r)|jdur+t|j dS dS dS )z
        Run the application service.

        @param twistOptions: Command line options to convert to runner
            arguments.
        r    logLevellogFilefileLogObserverFactory)r    defaultLogLevelr(   r)   N)r   runr   
providedBy_exitSignalr   )r&   runnerr    r   r   r   r+   H   s   

z	Twist.runc                 C   sT   |  |}|d }|j}|dusJ | j|j| |jd}| || | | dS )z
        Executable entry point for L{Twist}.
        Processes options and run a twisted reactor with a service.

        @param argv: Command line arguments.
        @type argv: L{list}
        r    N)r   r   )r   
subCommandr   plugins
subOptionsr#   r+   )clsr   r   r    r/   r   r   r   r   main\   s   
	z
Twist.main)__name__
__module____qualname____doc__staticmethodr   strr   r   r   r   r   r   r   r#   r+   classmethodsysr   r3   r   r   r   r   r      s    "r   )r7   r;   typingr   twisted.application.appr   twisted.internet.interfacesr   r   twisted.python.usager   r   runner._exitr	   r
   runner._runnerr   r   r   r   r   _optionsr   r   r   r   r   r   <module>   s   