Skip to content

Commit 33f998f

Browse files
authored
Add StringOrDefault type support in various constraints and config (#360)
2 parents 20e62b2 + 6034f94 commit 33f998f

18 files changed

Lines changed: 294 additions & 13 deletions

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
77
javaVersion=25
88
mcVersion=26.1.2
99
group=dev.slne.surf.api
10-
version=3.16.0
10+
version=3.17.0
1111
relocationPrefix=dev.slne.surf.api.libs
1212
snapshot=false

surf-api-core/surf-api-core/api/surf-api-core.api

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,22 @@ public final class dev/slne/surf/api/core/config/type/DurationOrDisabled {
578578
public final class dev/slne/surf/api/core/config/type/DurationOrDisabled$Companion {
579579
}
580580

581+
public final class dev/slne/surf/api/core/config/type/StringOrDefault {
582+
public static final field Companion Ldev/slne/surf/api/core/config/type/StringOrDefault$Companion;
583+
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
584+
public final fun component1 ()Ljava/lang/String;
585+
public fun equals (Ljava/lang/Object;)Z
586+
public final fun getValue ()Ljava/lang/String;
587+
public fun hashCode ()I
588+
public final fun or (Ljava/lang/String;)Ljava/lang/String;
589+
public fun toString ()Ljava/lang/String;
590+
}
591+
592+
public final class dev/slne/surf/api/core/config/type/StringOrDefault$Companion {
593+
public final fun getUSE_DEFAULT ()Ldev/slne/surf/api/core/config/type/StringOrDefault;
594+
public final fun of (Ljava/lang/String;)Ldev/slne/surf/api/core/config/type/StringOrDefault;
595+
}
596+
581597
public abstract interface annotation class dev/slne/surf/api/core/config/type/number/BelowZeroToEmpty : java/lang/annotation/Annotation {
582598
}
583599

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/CollectionConstraintUtils.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/Contains.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.slne.surf.api.core.config.constraints
22

3+
import dev.slne.surf.api.core.config.type.StringOrDefault
34
import org.spongepowered.configurate.objectmapping.meta.Constraint
45
import org.spongepowered.configurate.serialize.SerializationException
56
import java.lang.reflect.Type
@@ -23,5 +24,14 @@ annotation class Contains(val value: String) {
2324
}
2425
}
2526
}
27+
28+
internal object FactoryStringOrDefault : Constraint.Factory<Contains, StringOrDefault?> {
29+
override fun make(data: Contains, type: Type): Constraint<StringOrDefault?> = { valueOrDefault ->
30+
val value = valueOrDefault?.value
31+
if (value != null && !value.contains(data.value)) {
32+
throw SerializationException("String must contain '${data.value}'")
33+
}
34+
}
35+
}
2636
}
2737
}

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/EndsWith.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.slne.surf.api.core.config.constraints
22

3+
import dev.slne.surf.api.core.config.type.StringOrDefault
34
import org.spongepowered.configurate.objectmapping.meta.Constraint
45
import org.spongepowered.configurate.serialize.SerializationException
56
import java.lang.reflect.Type
@@ -23,5 +24,14 @@ annotation class EndsWith(val suffix: String) {
2324
}
2425
}
2526
}
27+
28+
internal object FactoryStringOrDefault : Constraint.Factory<EndsWith, StringOrDefault?> {
29+
override fun make(data: EndsWith, type: Type): Constraint<StringOrDefault?> = { stringOrDefault ->
30+
val value = stringOrDefault?.value
31+
if (value != null && !value.endsWith(data.suffix)) {
32+
throw SerializationException("String must end with '${data.suffix}'")
33+
}
34+
}
35+
}
2636
}
2737
}

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/ExistingFile.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.slne.surf.api.core.config.constraints
22

3+
import dev.slne.surf.api.core.config.type.StringOrDefault
34
import org.spongepowered.configurate.objectmapping.meta.Constraint
45
import org.spongepowered.configurate.serialize.SerializationException
56
import java.io.File
@@ -41,12 +42,13 @@ annotation class ExistingFile {
4142
}
4243
}
4344

44-
internal fun Any?.asPathOrNull(): Path? {
45+
internal tailrec fun Any?.asPathOrNull(): Path? {
4546
return when (this) {
4647
null -> null
4748
is Path -> this
4849
is File -> toPath()
4950
is String -> runCatching { Path.of(this) }.getOrNull()
51+
is StringOrDefault -> value?.asPathOrNull()
5052
else -> null
5153
}
5254
}

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/MaxDuration.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.slne.surf.api.core.config.constraints
22

33
import dev.slne.surf.api.core.config.type.ConfigDuration
4+
import dev.slne.surf.api.core.config.type.DurationOrDisabled
45
import org.spongepowered.configurate.objectmapping.meta.Constraint
56
import org.spongepowered.configurate.serialize.SerializationException
67
import java.lang.reflect.Type
@@ -25,5 +26,15 @@ annotation class MaxDuration(val seconds: Long) {
2526
}
2627
}
2728
}
29+
30+
internal object FactoryDurationOrDisabled : Constraint.Factory<MaxDuration, DurationOrDisabled?> {
31+
override fun make(data: MaxDuration, type: Type): Constraint<DurationOrDisabled?> = { durationOrDisabled ->
32+
val value = durationOrDisabled?.value
33+
34+
if (value != null && value.inWholeSeconds > data.seconds) {
35+
throw SerializationException("Duration is too long: ${value}, expected <= ${data.seconds}s")
36+
}
37+
}
38+
}
2839
}
2940
}

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/MaxLength.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.slne.surf.api.core.config.constraints
22

3+
import dev.slne.surf.api.core.config.type.StringOrDefault
34
import org.spongepowered.configurate.objectmapping.meta.Constraint
45
import org.spongepowered.configurate.serialize.SerializationException
56
import java.lang.reflect.Type
@@ -24,5 +25,14 @@ annotation class MaxLength(val max: Int) {
2425
}
2526
}
2627
}
28+
29+
internal object FactoryStringOrDefault : Constraint.Factory<MaxLength, StringOrDefault?> {
30+
override fun make(data: MaxLength, type: Type): Constraint<StringOrDefault?> = { stringOrDefault ->
31+
val value = stringOrDefault?.value
32+
if (value != null && value.length > data.max) {
33+
throw SerializationException("String is too long: ${value.length}, expected <= ${data.max}")
34+
}
35+
}
36+
}
2737
}
2838
}

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/MaxNumber.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.slne.surf.api.core.config.constraints
22

3+
import dev.slne.surf.api.core.config.type.number.DoubleOr
4+
import dev.slne.surf.api.core.config.type.number.IntOr
35
import org.spongepowered.configurate.objectmapping.meta.Constraint
46
import org.spongepowered.configurate.serialize.SerializationException
57
import java.lang.reflect.Type
@@ -35,5 +37,25 @@ annotation class MaxNumber(val max: Double) {
3537
}
3638
}
3739
}
40+
41+
internal object FactoryIntOr : Constraint.Factory<MaxNumber, IntOr?> {
42+
override fun make(data: MaxNumber, type: Type): Constraint<IntOr?> = { intOr ->
43+
val number = intOr?.value
44+
45+
if (number != null && number > data.max) {
46+
throw SerializationException(type, "Number is too big: $number, expected <= ${data.max}")
47+
}
48+
}
49+
}
50+
51+
internal object FactoryDoubleOr : Constraint.Factory<MaxNumber, DoubleOr?> {
52+
override fun make(data: MaxNumber, type: Type): Constraint<DoubleOr?> = { doubleOr ->
53+
val number = doubleOr?.value
54+
55+
if (number != null && number > data.max) {
56+
throw SerializationException(type, "Number is too big: $number, expected <= ${data.max}")
57+
}
58+
}
59+
}
3860
}
3961
}

surf-api-core/surf-api-core/src/main/kotlin/dev/slne/surf/api/core/config/constraints/MinDuration.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.slne.surf.api.core.config.constraints
22

33
import dev.slne.surf.api.core.config.type.ConfigDuration
4+
import dev.slne.surf.api.core.config.type.DurationOrDisabled
45
import org.spongepowered.configurate.objectmapping.meta.Constraint
56
import org.spongepowered.configurate.serialize.SerializationException
67
import java.lang.reflect.Type
@@ -25,5 +26,15 @@ annotation class MinDuration(val seconds: Long) {
2526
}
2627
}
2728
}
29+
30+
internal object FactoryDurationOrDisabled : Constraint.Factory<MinDuration, DurationOrDisabled?> {
31+
override fun make(data: MinDuration, type: Type): Constraint<DurationOrDisabled?> = { durationOrDisabled ->
32+
val value = durationOrDisabled?.value
33+
34+
if (value != null && value.inWholeSeconds < data.seconds) {
35+
throw SerializationException("Duration is too short: ${value}, expected >= ${data.seconds}s")
36+
}
37+
}
38+
}
2839
}
2940
}

0 commit comments

Comments
 (0)