package dev.inmo.tgbotapi.bot.ktor import dev.inmo.tgbotapi.requests.abstracts.Request interface KtorPipelineStepsHolder { /** * Will be called when any exception will happen due to the [request] handling. If returns value - that value * will be returned from [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead */ suspend fun onRequestException( request: Request, t: Throwable ): T? = null /** * Will always be called before requests executor will check all [callsFactories] for an opportunity to make call of * [request] */ suspend fun onBeforeSearchCallFactory( request: Request<*>, callsFactories: List ) {} /** * Will always be called before [potentialFactory] will try to make [request] */ suspend fun onBeforeCallFactoryMakeCall( request: Request<*>, potentialFactory: KtorCallFactory ) {} /** * Will always be called after [potentialFactory] has tried to make [request] and got some [result]. If returns * value - that value will be returned from [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead */ suspend fun onAfterCallFactoryMakeCall( result: T?, request: Request, potentialFactory: KtorCallFactory ): T? = result /** * Will be called when [resultCallFactory] is the [KtorCallFactory] from [callsFactories] which has successfully * handled [request] and returned [result]. If returns value - that value will be returned from * [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead */ suspend fun onRequestResultPresented( result: T, request: Request, resultCallFactory: KtorCallFactory, callsFactories: List ): T? = result /** * Will be called when there is no [KtorCallFactory] from [callsFactories] which may handle [request]. If returns * value - that value will be returned from [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead */ suspend fun onRequestResultAbsent( request: Request, callsFactories: List ): T? = null /** * This step will be called when the [result] has been retrieved (or exception has happened). If returns value - * that value will be returned from [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead */ suspend fun onRequestReturnResult( result: Result, request: Request, callsFactories: List ): T = result.getOrThrow() companion object : KtorPipelineStepsHolder }