Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ allprojects {
}
}

version = "0.0.3-alpha.2-SNAPSHOT"
version = "0.0.3-alpha.3-SNAPSHOT"
group = "io.github.ustudiocompany"

configurations.all {
Expand Down
31 changes: 31 additions & 0 deletions library/rules-engine/core/api/rules-engine-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,23 @@ public final class io/github/ustudiocompany/uframework/rulesengine/core/rule/ste
public fun toString ()Ljava/lang/String;
}

public final class io/github/ustudiocompany/uframework/rulesengine/core/rule/step/DataChangeTrackingStep : io/github/ustudiocompany/uframework/rulesengine/core/rule/step/Step {
public synthetic fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1-946-LrQ ()Ljava/lang/String;
public final fun component2-x1RwLDY ()Ljava/util/List;
public final fun component3-ROXRKBE ()Ljava/lang/String;
public final fun component4-okKJLwA ()Ljava/util/List;
public final fun copy-85og4WU (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;)Lio/github/ustudiocompany/uframework/rulesengine/core/rule/step/DataChangeTrackingStep;
public static synthetic fun copy-85og4WU$default (Lio/github/ustudiocompany/uframework/rulesengine/core/rule/step/DataChangeTrackingStep;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lio/github/ustudiocompany/uframework/rulesengine/core/rule/step/DataChangeTrackingStep;
public fun equals (Ljava/lang/Object;)Z
public final fun getArgs-okKJLwA ()Ljava/util/List;
public fun getCondition-x1RwLDY ()Ljava/util/List;
public fun getId-946-LrQ ()Ljava/lang/String;
public final fun getUri-ROXRKBE ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class io/github/ustudiocompany/uframework/rulesengine/core/rule/step/DataRetrieveStep : io/github/ustudiocompany/uframework/rulesengine/core/rule/step/Step {
public synthetic fun <init> (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Lio/github/ustudiocompany/uframework/rulesengine/core/rule/step/StepResult;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1-946-LrQ ()Ljava/lang/String;
Expand Down Expand Up @@ -541,6 +558,20 @@ public final class io/github/ustudiocompany/uframework/rulesengine/core/rule/ste
public final synthetic fun unbox-impl ()Ljava/util/List;
}

public final class io/github/ustudiocompany/uframework/rulesengine/core/rule/step/Uiss {
public static final synthetic fun box-impl (Ljava/lang/String;)Lio/github/ustudiocompany/uframework/rulesengine/core/rule/step/Uiss;
public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z
public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z
public final fun getGet ()Ljava/lang/String;
public fun hashCode ()I
public static fun hashCode-impl (Ljava/lang/String;)I
public fun toString ()Ljava/lang/String;
public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String;
public final synthetic fun unbox-impl ()Ljava/lang/String;
}

public final class io/github/ustudiocompany/uframework/rulesengine/core/rule/step/Uri {
public static final synthetic fun box-impl (Ljava/lang/String;)Lio/github/ustudiocompany/uframework/rulesengine/core/rule/step/Uri;
public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.github.ustudiocompany.uframework.rulesengine.core.rule.step

import io.github.ustudiocompany.uframework.rulesengine.core.rule.condition.Condition

public data class DataChangeTrackingStep(
public override val id: StepId,
public override val condition: Condition,
public val uri: Uiss,
public val args: Args,
) : Step
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.github.ustudiocompany.uframework.rulesengine.core.rule.step

@JvmInline
public value class Uiss(public val get: String)
54 changes: 53 additions & 1 deletion library/rules-engine/executor/api/rules-engine-executor.api
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,52 @@ public final class io/github/ustudiocompany/uframework/rulesengine/core/data/Dat
public fun getDetails ()Lio/github/ustudiocompany/uframework/failure/Failure$Details;
}

public abstract interface class io/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider {
public abstract fun prepare-CsHC-xs (Ljava/lang/String;Ljava/util/List;)Lio/github/airflux/commons/types/maybe/Maybe;
}

public final class io/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Arg {
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Arg;
public static synthetic fun copy$default (Lio/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Arg;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Arg;
public fun equals (Ljava/lang/Object;)Z
public final fun getName ()Ljava/lang/String;
public final fun getValue ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class io/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Error : io/github/ustudiocompany/uframework/rulesengine/core/BasicRulesEngineError {
public fun <init> ()V
public fun <init> (Lio/github/ustudiocompany/uframework/failure/Failure;)V
public fun <init> (Ljava/lang/String;Ljava/lang/Throwable;Lio/github/ustudiocompany/uframework/failure/Failure$Details;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/Throwable;Lio/github/ustudiocompany/uframework/failure/Failure$Details;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun getCause ()Lio/github/ustudiocompany/uframework/failure/Failure$Cause;
public fun getCode ()Ljava/lang/String;
public fun getDescription ()Ljava/lang/String;
public fun getDetails ()Lio/github/ustudiocompany/uframework/failure/Failure$Details;
}

public final class io/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Uiss {
public static final field Companion Lio/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Uiss$Companion;
public static final synthetic fun box-impl (Ljava/lang/String;)Lio/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Uiss;
public fun equals (Ljava/lang/Object;)Z
public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z
public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z
public final fun getGet ()Ljava/lang/String;
public fun hashCode ()I
public static fun hashCode-impl (Ljava/lang/String;)I
public fun toString ()Ljava/lang/String;
public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String;
public final synthetic fun unbox-impl ()Ljava/lang/String;
}

public final class io/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider$Uiss$Companion {
public final fun from-dYhJz7w (Ljava/lang/String;)Ljava/lang/String;
}

public abstract interface class io/github/ustudiocompany/uframework/rulesengine/executor/DataProvider {
public abstract fun get-2nBdgHM (Ljava/lang/String;Ljava/util/List;)Lio/github/airflux/commons/types/resultk/ResultK;
}
Expand Down Expand Up @@ -96,7 +142,7 @@ public final class io/github/ustudiocompany/uframework/rulesengine/executor/Mess
}

public final class io/github/ustudiocompany/uframework/rulesengine/executor/RulesEngineExecutor {
public fun <init> (Lio/github/ustudiocompany/uframework/rulesengine/executor/DataProvider;Lio/github/ustudiocompany/uframework/rulesengine/executor/MessagePublisher;Lio/github/ustudiocompany/uframework/rulesengine/executor/Merger;)V
public fun <init> (Lio/github/ustudiocompany/uframework/rulesengine/executor/DataProvider;Lio/github/ustudiocompany/uframework/rulesengine/executor/MessagePublisher;Lio/github/ustudiocompany/uframework/rulesengine/executor/DataChangeTrackerProvider;Lio/github/ustudiocompany/uframework/rulesengine/executor/Merger;)V
public final fun execute-LHWKZ78 (Lio/github/ustudiocompany/uframework/rulesengine/core/env/EnvVars;Lio/github/ustudiocompany/uframework/rulesengine/core/context/Context;Ljava/util/List;)Lio/github/airflux/commons/types/resultk/ResultK;
}

Expand All @@ -115,6 +161,12 @@ public final class io/github/ustudiocompany/uframework/rulesengine/executor/erro
public fun getDescription ()Ljava/lang/String;
}

public final class io/github/ustudiocompany/uframework/rulesengine/executor/error/RulesEngineExecutorError$DataChangeTrackingStepExecute : io/github/ustudiocompany/uframework/rulesengine/executor/error/RulesEngineExecutorError {
public fun getCause ()Lio/github/ustudiocompany/uframework/failure/Failure$Cause;
public fun getCode ()Ljava/lang/String;
public fun getDescription ()Ljava/lang/String;
}

public final class io/github/ustudiocompany/uframework/rulesengine/executor/error/RulesEngineExecutorError$DataRetrievingStepExecute : io/github/ustudiocompany/uframework/rulesengine/executor/error/RulesEngineExecutorError {
public fun getCause ()Lio/github/ustudiocompany/uframework/failure/Failure$Cause;
public fun getCode ()Ljava/lang/String;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package io.github.ustudiocompany.uframework.rulesengine.core.rule.step

import io.github.airflux.commons.types.maybe.Maybe
import io.github.airflux.commons.types.maybe.map
import io.github.airflux.commons.types.maybe.maybeFailure
import io.github.airflux.commons.types.resultk.mapFailure
import io.github.ustudiocompany.uframework.failure.Failure
import io.github.ustudiocompany.uframework.rulesengine.core.BasicRulesEngineError
import io.github.ustudiocompany.uframework.rulesengine.core.context.Context
import io.github.ustudiocompany.uframework.rulesengine.core.env.EnvVars
import io.github.ustudiocompany.uframework.rulesengine.core.rule.condition.CheckingConditionSatisfactionErrors
import io.github.ustudiocompany.uframework.rulesengine.core.rule.condition.isSatisfied
import io.github.ustudiocompany.uframework.rulesengine.executor.DataChangeTrackerProvider

internal fun DataChangeTrackingStep.executeIfSatisfied(
envVars: EnvVars,
context: Context,
dataChangeTrackerProvider: DataChangeTrackerProvider,
): Maybe<DataChangeTrackingStepExecuteErrors> {
val step = this
return maybeFailure {
val (isSatisfied) = condition.isSatisfied(envVars, context)
.mapFailure { failure -> DataChangeTrackingStepExecuteErrors.CheckingConditionSatisfaction(failure) }

if (isSatisfied) {
val (args) = args.build(envVars, context) { name, value ->
DataChangeTrackerProvider.Arg(name, value)
}.mapFailure { failure -> DataChangeTrackingStepExecuteErrors.ArgsBuilding(failure) }
val uri = DataChangeTrackerProvider.Uiss.from(step.uri.get)
dataChangeTrackerProvider.prepare(uri, args)
.map { failure -> DataChangeTrackingStepExecuteErrors.Preparing(failure) }
} else
Maybe.none()
}
}

internal sealed interface DataChangeTrackingStepExecuteErrors : BasicRulesEngineError {

class CheckingConditionSatisfaction(cause: CheckingConditionSatisfactionErrors) :
DataChangeTrackingStepExecuteErrors {
override val code: String = PREFIX + "1"
override val description: String = "Error checking condition satisfaction of 'Data Change Tracking' step."
override val cause: Failure.Cause = Failure.Cause.Failure(cause)
}

class ArgsBuilding(cause: ArgsBuilderErrors) : DataChangeTrackingStepExecuteErrors {
override val code: String = PREFIX + "2"
override val description: String = "Error building args for data provider of 'Data Change Tracking' step."
override val cause: Failure.Cause = Failure.Cause.Failure(cause)
}

class Preparing(cause: DataChangeTrackerProvider.Error) : DataChangeTrackingStepExecuteErrors {
override val code: String = PREFIX + "3"
override val description: String = "Error preparing to track data changes."
override val cause: Failure.Cause = Failure.Cause.Failure(cause)
}

private companion object {
private const val PREFIX = "DATA-CHANGE-TRACKING-STEP-EXECUTION-"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package io.github.ustudiocompany.uframework.rulesengine.executor

import io.github.airflux.commons.types.maybe.Maybe
import io.github.ustudiocompany.uframework.failure.Failure
import io.github.ustudiocompany.uframework.rulesengine.core.BasicRulesEngineError
import java.net.URLEncoder
import kotlin.text.Charsets.UTF_8

public fun interface DataChangeTrackerProvider {

public fun prepare(uiss: Uiss, args: List<Arg>): Maybe<Error>

@JvmInline
public value class Uiss private constructor(public val get: String) {

public companion object {
public fun from(value: String): Uiss = Uiss(URLEncoder.encode(value, UTF_8))
}
}

public data class Arg(
public val name: String,
public val value: String
)

public class Error private constructor(
message: String = "",
override val cause: Failure.Cause,
override val details: Failure.Details = Failure.Details.NONE
) : BasicRulesEngineError {

public constructor() : this(
message = "",
cause = Failure.Cause.None,
details = Failure.Details.NONE
)

public constructor(cause: Failure) :
this(
cause = Failure.Cause.Failure(cause)
)

public constructor(
message: String,
exception: Throwable? = null,
details: Failure.Details = Failure.Details.NONE
) :
this(
message = message,
cause = if (exception != null)
Failure.Cause.Exception(exception)
else
Failure.Cause.None,
details = details
)

override val code: String = PREFIX + "1"
override val description: String =
"The error of preparing to track data changes." + if (message.isNotEmpty()) " $message" else ""

private companion object {
private const val PREFIX = "DATA-CHANGE-TRACKER-PROVIDER-"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import io.github.ustudiocompany.uframework.rulesengine.core.rule.Rule
import io.github.ustudiocompany.uframework.rulesengine.core.rule.Rules
import io.github.ustudiocompany.uframework.rulesengine.core.rule.condition.isSatisfied
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.DataBuildStep
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.DataChangeTrackingStep
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.DataRetrieveStep
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.MessagePublishStep
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.Steps
Expand All @@ -28,6 +29,7 @@ public typealias ExecutionResult = ResultK<ValidationStep.ErrorCode?, RulesEngin
public class RulesEngineExecutor(
private val dataProvider: DataProvider,
private val messagePublisher: MessagePublisher,
private val dataChangeTrackerProvider: DataChangeTrackerProvider,
private val merger: Merger
) {

Expand Down Expand Up @@ -61,6 +63,7 @@ public class RulesEngineExecutor(
is DataBuildStep -> step.execute(vars, context)
is ValidationStep -> step.execute(vars, context)
is MessagePublishStep -> step.execute(vars, context)
is DataChangeTrackingStep -> step.execute(vars, context)
}

if (result.isFailure() || result.value != null) return result
Expand All @@ -87,6 +90,11 @@ public class RulesEngineExecutor(
.map { failure -> RulesEngineExecutorError.MessagePublishStepExecute(failure) }
.toResultAsFailureOr(ResultK.Success.asNull)

private fun DataChangeTrackingStep.execute(envVars: EnvVars, context: Context): ExecutionResult =
executeIfSatisfied(envVars, context, dataChangeTrackerProvider)
.map { failure -> RulesEngineExecutorError.DataChangeTrackingStepExecute(failure) }
.toResultAsFailureOr(ResultK.Success.asNull)

private companion object {
private val RULE_ID = EnvVarName("__RULE_ID__")
private val STEP_ID = EnvVarName("__STEP_ID__")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import io.github.ustudiocompany.uframework.failure.Failure
import io.github.ustudiocompany.uframework.rulesengine.core.BasicRulesEngineError
import io.github.ustudiocompany.uframework.rulesengine.core.rule.condition.CheckingConditionSatisfactionErrors
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.DataBuildStepExecuteError
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.DataChangeTrackingStepExecuteErrors
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.DataRetrieveStepExecuteErrors
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.MessagePublishStepExecuteErrors
import io.github.ustudiocompany.uframework.rulesengine.core.rule.step.ValidationStepExecuteError
Expand Down Expand Up @@ -50,6 +51,14 @@ public sealed interface RulesEngineExecutorError : BasicRulesEngineError {
override val cause: Failure.Cause = Failure.Cause.Failure(cause)
}

public class DataChangeTrackingStepExecute internal constructor(
cause: DataChangeTrackingStepExecuteErrors
) : RulesEngineExecutorError {
override val code: String = PREFIX + "5"
override val description: String = "The error of execution the 'Data Change Tracking' step."
override val cause: Failure.Cause = Failure.Cause.Failure(cause)
}

private companion object {
private const val PREFIX = "RULES-EXECUTION-"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ internal class RulesEngineExecutorTest : UnitTest() {
val executor = RulesEngineExecutor(
dataProvider = { _, _ -> DATA_RETRIEVE_RESULT.asSuccess() },
messagePublisher = { _, _, _ -> Maybe.none() },
dataChangeTrackerProvider = { _, _ -> Maybe.none() },
merger = { _, origin, _ -> origin.asSuccess() }
)
val envVars = envVarsOf()
Expand Down Expand Up @@ -68,6 +69,7 @@ internal class RulesEngineExecutorTest : UnitTest() {
val executor = RulesEngineExecutor(
dataProvider = { _, _ -> DATA_RETRIEVE_RESULT.asSuccess() },
messagePublisher = { _, _, _ -> Maybe.none() },
dataChangeTrackerProvider = { _, _ -> Maybe.none() },
merger = { _, origin, _ -> origin.asSuccess() }
)
val envVars = envVarsOf()
Expand Down
Loading
Loading