master
Koitharu 1 year ago
parent 29263ff59b
commit 843d1f1bea
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -1,7 +1,6 @@
package org.koitharu.kotatsu.parsers.model.search package org.koitharu.kotatsu.parsers.model.search
import androidx.collection.ArraySet import androidx.collection.ArraySet
import org.koitharu.kotatsu.parsers.InternalParsersApi
import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.* import org.koitharu.kotatsu.parsers.model.search.QueryCriteria.*
import org.koitharu.kotatsu.parsers.util.mapToSet import org.koitharu.kotatsu.parsers.util.mapToSet
@ -12,38 +11,35 @@ public data class MangaSearchQueryCapabilities internal constructor(
public constructor(vararg capabilities: SearchCapability) : this(ArraySet(capabilities)) public constructor(vararg capabilities: SearchCapability) : this(ArraySet(capabilities))
@InternalParsersApi internal fun validate(query: MangaSearchQuery) {
public fun validate(query: MangaSearchQuery) {
val strictFields = capabilities.filter { it.isExclusive }.mapToSet { it.field } val strictFields = capabilities.filter { it.isExclusive }.mapToSet { it.field }
val usedStrictFields = query.criteria.mapToSet { it.field }.intersect(strictFields) val usedStrictFields = query.criteria.mapToSet { it.field }.intersect(strictFields)
if (usedStrictFields.isNotEmpty() && query.criteria.size > 1) { require(usedStrictFields.isEmpty() || query.criteria.size <= 1) {
throw IllegalArgumentException( "Query contains multiple criteria, but at least one field (${usedStrictFields.joinToString()}) does not support multiple criteria."
"Query contains multiple criteria, but at least one field (${usedStrictFields.joinToString()}) does not support multiple criteria.",
)
} }
for (criterion in query.criteria) { for (criterion in query.criteria) {
val capability = capabilities.find { it.field == criterion.field } val capability = requireNotNull(capabilities.find { it.field == criterion.field }) {
?: throw IllegalArgumentException("Unsupported search field: ${criterion.field}") "Unsupported search field: ${criterion.field}"
}
if (criterion::class !in capability.criteriaTypes) { require(criterion::class in capability.criteriaTypes) {
throw IllegalArgumentException( "Unsupported search criterion: ${criterion::class.simpleName} for field ${criterion.field}"
"Unsupported search criterion: ${criterion::class.simpleName} for field ${criterion.field}",
)
} }
// Ensure single value per criterion if supportMultiValue is false // Ensure single value per criterion if supportMultiValue is false
if (!capability.isMultiple) { if (!capability.isMultiple) {
when (criterion) { when (criterion) {
is Include<*> -> if (criterion.values.size > 1) is Include<*> -> require(criterion.values.size <= 1) {
throw IllegalArgumentException("Multiple values are not allowed for field ${criterion.field}") "Multiple values are not allowed for field ${criterion.field}"
}
is Exclude<*> -> if (criterion.values.size > 1) is Exclude<*> -> require(criterion.values.size <= 1) {
throw IllegalArgumentException("Multiple values are not allowed for field ${criterion.field}") "Multiple values are not allowed for field ${criterion.field}"
}
is Range<*> -> {} // Range is always valid (from, to) is Range<*> -> Unit // Range is always valid (from, to)
is Match<*> -> {} // Match always has a single value is Match<*> -> Unit // Match always has a single value
} }
} }
} }

@ -19,5 +19,5 @@ public enum class SearchableField(public val type: Class<*>) {
CONTENT_TYPE(ContentType::class.java), CONTENT_TYPE(ContentType::class.java),
CONTENT_RATING(ContentRating::class.java), CONTENT_RATING(ContentRating::class.java),
DEMOGRAPHIC(Demographic::class.java), DEMOGRAPHIC(Demographic::class.java),
PUBLICATION_YEAR(Int::class.java); PUBLICATION_YEAR(Int::class.javaObjectType);
} }

Loading…
Cancel
Save