Skip to content

Commit

Permalink
RetryKoraAspect
Browse files Browse the repository at this point in the history
  • Loading branch information
GoodforGod committed Aug 1, 2023
1 parent 5440602 commit 017138d
Showing 1 changed file with 7 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ import java.util.concurrent.Future
class RetryKoraAspect(val resolver: Resolver) : KoraAspect {

companion object {
const val ANNOTATION_TYPE: String = "ru.tinkoff.kora.resilient.kora.Retry"
private val MEMBER_RETRY_STATUS = ClassName("ru.tinkoff.kora.resilient.kora.retry", "Retry", "RetryState", "RetryStatus")
private val MEMBER_RETRY_EXCEPTION = MemberName("ru.tinkoff.kora.resilient.kora.retry", "RetryExhaustedException")
const val ANNOTATION_TYPE: String = "ru.tinkoff.kora.resilient.retry.annotation.Retry"
private val MEMBER_RETRY_STATUS = ClassName("ru.tinkoff.kora.resilient.retry", "Retry", "RetryState", "RetryStatus")
private val MEMBER_RETRY_EXCEPTION = MemberName("ru.tinkoff.kora.resilient.retry", "RetryExhaustedException")
private val MEMBER_DELAY = MemberName("kotlinx.coroutines", "delay")
private val MEMBER_TIME = MemberName("kotlin.time.Duration.Companion", "nanoseconds")
private val MEMBER_FLOW = MemberName("kotlinx.coroutines.flow", "flow")
Expand All @@ -51,9 +51,9 @@ class RetryKoraAspect(val resolver: Resolver) : KoraAspect {
val annotation = method.annotations.filter { a -> a.annotationType.resolve().toClassName().canonicalName == ANNOTATION_TYPE }.first()
val retryableName = annotation.arguments.asSequence().filter { arg -> arg.name!!.getShortName() == "value" }.map { arg -> arg.value.toString() }.first()

val managerType = resolver.getClassDeclarationByName("ru.tinkoff.kora.resilient.kora.retry.RetryManager")!!.asType(listOf())
val managerType = resolver.getClassDeclarationByName("ru.tinkoff.kora.resilient.retry.RetryManager")!!.asType(listOf())
val fieldManager = aspectContext.fieldFactory.constructorParam(managerType, listOf())
val retrierType = resolver.getClassDeclarationByName("ru.tinkoff.kora.resilient.kora.retry.Retry")!!.asType(listOf())
val retrierType = resolver.getClassDeclarationByName("ru.tinkoff.kora.resilient.retry.Retry")!!.asType(listOf())
val fieldRetrier = aspectContext.fieldFactory.constructorInitialized(
retrierType,
CodeBlock.of("%L[%S]", fieldManager, retryableName)
Expand All @@ -72,14 +72,12 @@ class RetryKoraAspect(val resolver: Resolver) : KoraAspect {

private fun buildBodySync(method: KSFunctionDeclaration, superCall: String, retryName: String, fieldRetrier: String): CodeBlock {
return CodeBlock.builder()
.add("return %L.asState()", fieldRetrier).indent().add("\n")
.add("%L.asState()", fieldRetrier).indent().add("\n")
.controlFlow(".use { _state ->", fieldRetrier) {
addStatement("val _suppressed = %T<Exception>();", ArrayList::class)
addStatement("lateinit var _result: %T", method.returnType?.resolve()?.toTypeName())
controlFlow("while (true)") {
controlFlow("try") {
add("_result = ").add(buildMethodCall(method, superCall)).add("\n")
addStatement("break")
add("return ").add(buildMethodCall(method, superCall)).add("\n")
nextControlFlow("catch (_e: Exception)")
addStatement("val _status = _state.onException(_e)")
controlFlow("when (_status)") {
Expand Down Expand Up @@ -108,10 +106,8 @@ class RetryKoraAspect(val resolver: Resolver) : KoraAspect {
}
}
}
addStatement("return@use _result")
}
.unindent()
.add("\n")
.build()
}

Expand Down

0 comments on commit 017138d

Please sign in to comment.