commonMain.internal.actions.UpdateDescendantsDisplayingIssuesAction.kt Maven / Gradle / Ivy
package io.kform.internal.actions
import io.kform.AbsolutePath
import io.kform.FormManager
import io.kform.StateEvent
import io.kform.ValidationIssueSeverity
import io.kform.internal.*
/**
* Action that updates the number of descendants displaying issues of each severity at [path], as
* well as their parents, by [displayingErrors] (which can be either a positive or negative value).
*/
internal class UpdateDescendantsDisplayingIssuesAction(
formManager: FormManager,
private val path: AbsolutePath,
private val displayingErrors: Int = 0,
private val displayingWarnings: Int = 0,
) : ValueStateAction(formManager) {
constructor(
formManager: FormManager,
path: AbsolutePath,
issueSeverity: ValidationIssueSeverity,
amount: Int = 0
) : this(
formManager,
path,
if (issueSeverity == ValidationIssueSeverity.Error) amount else 0,
if (issueSeverity == ValidationIssueSeverity.Warning) amount else 0
)
override fun toString() =
"UpdateDesdendantsDisplayingIssues($path${
if (displayingErrors != 0) ", displayingErrors=$displayingErrors" else ""}${
if (displayingWarnings != 0) ", displayingWarnings=$displayingWarnings" else ""})"
override val accesses =
listOf(
AccessValueStateTree(ActionAccessType.Read),
AccessValidationState(ActionAccessType.Read),
AccessIsTouched(ActionAccessType.Read),
AccessDescendantsDisplayingIssues(ActionAccessType.Write)
)
override val accessedPaths = parentPaths(path) + path
override suspend fun run() = updateDescendantsDisplayingIssues(path)
private tailrec suspend fun updateDescendantsDisplayingIssues(path: AbsolutePath) {
val info = stateInfo(path).single()
val state = info.state as ParentStateImpl
val oldDisplayStatus = state.displayStatus()
state.descendantsDisplayingErrors += displayingErrors
state.descendantsDisplayingWarnings += displayingWarnings
val newDisplayStatus = state.displayStatus()
if (oldDisplayStatus != newDisplayStatus) {
formManager.eventsBus.emit(
StateEvent.DisplayChange(newDisplayStatus, path, info.schema)
)
}
if (path != AbsolutePath.ROOT) {
updateDescendantsDisplayingIssues(path.parent())
}
}
}