Skip to content

Commit

Permalink
Refactor ifPresent and required (#153)
Browse files Browse the repository at this point in the history
  • Loading branch information
dhoepelman authored Oct 31, 2024
1 parent 115d231 commit af642ab
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 35 deletions.
3 changes: 1 addition & 2 deletions api/konform.api
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,8 @@ public final class io/konform/validation/string/ValidationBuilderStringKt {
public static final fun notBlank (Lio/konform/validation/ValidationBuilder;)Lio/konform/validation/Constraint;
}

public final class io/konform/validation/validations/IsClassValidation : io/konform/validation/Validation {
public final class io/konform/validation/types/IsClassValidation : io/konform/validation/Validation {
public fun <init> (Lkotlin/reflect/KClass;ZLio/konform/validation/Validation;)V
public synthetic fun <init> (Lkotlin/reflect/KClass;ZLio/konform/validation/Validation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun invoke (Ljava/lang/Object;)Lio/konform/validation/ValidationResult;
public fun validate (Ljava/lang/Object;)Lio/konform/validation/ValidationResult;
}
Expand Down
15 changes: 4 additions & 11 deletions src/commonMain/kotlin/io/konform/validation/ValidationBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@ import io.konform.validation.builder.SingleValuePropKey
import io.konform.validation.internal.ArrayValidation
import io.konform.validation.internal.IterableValidation
import io.konform.validation.internal.MapValidation
import io.konform.validation.internal.OptionalValidation
import io.konform.validation.internal.RequiredValidation
import io.konform.validation.internal.ValidationNode
import io.konform.validation.kotlin.Grammar
import io.konform.validation.validations.IsClassValidation
import io.konform.validation.types.IsClassValidation
import io.konform.validation.types.NullableValidation
import kotlin.jvm.JvmName
import kotlin.reflect.KFunction1
import kotlin.reflect.KProperty1
Expand Down Expand Up @@ -185,23 +184,17 @@ public class ValidationBuilder<T> {
}
}

// TODO: ifPresent and required extension functions are hidden since the introduction of then on main validation builder
// but they do something different
// possible solutions:
// - Move main validation to extension function
// - Rename main validation extension function

/**
* Run a validation if the property is not-null, and allow nulls.
*/
public fun <T : Any> ValidationBuilder<T?>.ifPresent(init: ValidationBuilder<T>.() -> Unit): Unit =
run(OptionalValidation(buildWithNew(init)))
run(NullableValidation(required = false, validation = buildWithNew(init)))

/**
* Run a validation on a nullable property, giving an error on nulls.
*/
public fun <T : Any> ValidationBuilder<T?>.required(init: ValidationBuilder<T>.() -> Unit): Unit =
run(RequiredValidation<T>(buildWithNew(init)))
run(NullableValidation(required = true, validation = buildWithNew(init)))

@JvmName("onEachIterable")
public fun <S, T : Iterable<S>> ValidationBuilder<T>.onEach(init: ValidationBuilder<S>.() -> Unit) {
Expand Down
20 changes: 0 additions & 20 deletions src/commonMain/kotlin/io/konform/validation/internal/Validation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,6 @@ import io.konform.validation.Valid
import io.konform.validation.Validation
import io.konform.validation.ValidationResult

internal class OptionalValidation<T : Any>(
private val validation: Validation<T>,
) : Validation<T?> {
override fun validate(value: T?): ValidationResult<T?> {
val nonNullValue = value ?: return Valid(value)
return validation(nonNullValue)
}
}

internal class RequiredValidation<T : Any>(
private val validation: Validation<T>,
) : Validation<T?> {
override fun validate(value: T?): ValidationResult<T?> {
val nonNullValue =
value
?: return Invalid(mapOf("" to listOf("is required")))
return validation(nonNullValue)
}
}

/** A property that is required and not null. */
internal class NonNullPropertyValidation<T, R>(
val property: (T) -> R,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package io.konform.validation.validations
package io.konform.validation.types

import io.konform.validation.Invalid
import io.konform.validation.Valid
Expand All @@ -18,7 +18,7 @@ import kotlin.reflect.safeCast
*/
public class IsClassValidation<T : ParentT & Any, ParentT>(
private val clazz: KClass<T>,
private val required: Boolean = false,
private val required: Boolean,
private val validation: Validation<T>,
) : Validation<ParentT> {
override fun validate(value: ParentT): ValidationResult<ParentT> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.konform.validation.types

import io.konform.validation.Invalid
import io.konform.validation.Valid
import io.konform.validation.Validation
import io.konform.validation.ValidationResult

internal class NullableValidation<T : Any>(
private val required: Boolean,
private val validation: Validation<T>,
) : Validation<T?> {
override fun validate(value: T?): ValidationResult<T?> =
if (value == null) {
if (required) {
Invalid(mapOf("" to listOf("is required")))
} else {
Valid(value)
}
} else {
validation(value)
}
}

0 comments on commit af642ab

Please sign in to comment.