From 0e69d88f1e62b218d1042600f84fbe19de708016 Mon Sep 17 00:00:00 2001 From: Sakib Hadziavdic Date: Sun, 22 Dec 2024 17:58:09 +0100 Subject: [PATCH] Simplify validator --- docs/src/files/tutorials/Validation.scala | 2 +- examples/api/src/requests.scala | 2 +- examples/scala-cli/validation.sc | 4 +-- validson/src/ba/sake/validson/Validator.scala | 25 +++---------------- .../src/ba/sake/validson/ValidsonSuite.scala | 4 +-- 5 files changed, 10 insertions(+), 27 deletions(-) diff --git a/docs/src/files/tutorials/Validation.scala b/docs/src/files/tutorials/Validation.scala index f8a96de..d5ac0ca 100644 --- a/docs/src/files/tutorials/Validation.scala +++ b/docs/src/files/tutorials/Validation.scala @@ -27,7 +27,7 @@ object Validation extends TutorialPage { .derived[ValidatedData] .positive(_.num) .notBlank(_.str) - .notEmptySeq(_.seq) + .minItems(_.seq, 1) ``` The `ValidatedData` can be any `case class`: json data, form data, query params.. diff --git a/examples/api/src/requests.scala b/examples/api/src/requests.scala index 7b8d5a7..f5590bf 100644 --- a/examples/api/src/requests.scala +++ b/examples/api/src/requests.scala @@ -13,7 +13,7 @@ object CreateProductReq: given Validator[CreateProductReq] = Validator .derived[CreateProductReq] .notBlank(_.name) - .nonnegative(_.quantity) + .nonNegative(_.quantity) // query params case class ProductsQuery(name: Set[String], minQuantity: Option[Int]) derives QueryStringRW diff --git a/examples/scala-cli/validation.sc b/examples/scala-cli/validation.sc index b19c6d3..aa23e6e 100644 --- a/examples/scala-cli/validation.sc +++ b/examples/scala-cli/validation.sc @@ -1,5 +1,5 @@ //> using scala "3.4.2" -//> using dep ba.sake::sharaf:0.7.0 +//> using dep ba.sake::sharaf:0.7.6 import io.undertow.Undertow import ba.sake.querson.QueryStringRW @@ -13,7 +13,7 @@ object Car: .derived[Car] .notBlank(_.brand) .notBlank(_.model) - .nonnegative(_.quantity) + .nonNegative(_.quantity) case class CarQuery(brand: String) derives QueryStringRW object CarQuery: diff --git a/validson/src/ba/sake/validson/Validator.scala b/validson/src/ba/sake/validson/Validator.scala index b7dda90..d8ea18f 100644 --- a/validson/src/ba/sake/validson/Validator.scala +++ b/validson/src/ba/sake/validson/Validator.scala @@ -24,19 +24,16 @@ trait Validator[T] { def negative[F: Numeric](getter: T => sourcecode.Text[F]): Validator[T] = validatorImpl(getter, _ < summon[Numeric[F]].zero, s"must be negative") - def nonpositive[F: Numeric](getter: T => sourcecode.Text[F]): Validator[T] = + def nonPositive[F: Numeric](getter: T => sourcecode.Text[F]): Validator[T] = validatorImpl(getter, _ <= summon[Numeric[F]].zero, s"must be nonpositive") def positive[F: Numeric](getter: T => sourcecode.Text[F]): Validator[T] = validatorImpl(getter, _ > summon[Numeric[F]].zero, s"must be positive") - def nonnegative[F: Numeric](getter: T => sourcecode.Text[F]): Validator[T] = + def nonNegative[F: Numeric](getter: T => sourcecode.Text[F]): Validator[T] = validatorImpl(getter, _ >= summon[Numeric[F]].zero, s"must be nonnegative") // strings - def notEmpty(getter: T => sourcecode.Text[String]): Validator[T] = - validatorImpl(getter, !_.isEmpty, "must not be empty") - def notBlank(getter: T => sourcecode.Text[String]): Validator[T] = validatorImpl(getter, !_.isBlank, "must not be blank") @@ -53,25 +50,11 @@ trait Validator[T] { validatorImpl(getter, _.matches(value), s"must contain $value") // seqs - def notEmpty(getter: T => sourcecode.Text[Seq[?]]): Validator[T] = - validatorImpl(getter, !_.isEmpty, "must not be empty") - - def minItems(getter: T => sourcecode.Text[Seq[?]], value: String): Validator[T] = - validatorImpl(getter, _.size >= value, s"must be >= $value") - - def maxItems(getter: T => sourcecode.Text[Seq[?]], value: String): Validator[T] = - validatorImpl(getter, _.size <= value, s"must be <= $value") - - // sets - def notEmpty(getter: T => sourcecode.Text[Set[?]]): Validator[T] = - validatorImpl(getter, !_.isEmpty, "must not be empty") - - def minItems(getter: T => sourcecode.Text[Set[?]], value: String): Validator[T] = + def minItems(getter: T => sourcecode.Text[Iterable[?]], value: Int): Validator[T] = validatorImpl(getter, _.size >= value, s"must be >= $value") - def maxItems(getter: T => sourcecode.Text[Set[?]], value: String): Validator[T] = + def maxItems(getter: T => sourcecode.Text[Iterable[?]], value: Int): Validator[T] = validatorImpl(getter, _.size <= value, s"must be <= $value") - private def validatorImpl[F](getter: T => sourcecode.Text[F], predicate: F => Boolean, msg: String): Validator[T] = (value: T) => { diff --git a/validson/test/src/ba/sake/validson/ValidsonSuite.scala b/validson/test/src/ba/sake/validson/ValidsonSuite.scala index cefbebe..575efed 100644 --- a/validson/test/src/ba/sake/validson/ValidsonSuite.scala +++ b/validson/test/src/ba/sake/validson/ValidsonSuite.scala @@ -72,7 +72,7 @@ object SimpleData: .derived[SimpleData] .positive(_.num) .notBlank(_.str) - .notEmptySeq(_.seq) + .minItems(_.seq, 1) .and(_.seq, _.forall(_.size == 2), "must have elements of size 2") case class ComplexData(password: String, datas: Seq[SimpleData], matrix: Seq[Seq[SimpleData]]) @@ -83,4 +83,4 @@ object ComplexData: .derived[ComplexData] .contains(_.password, "A") .contains(_.password, "5") - .notEmptySeq(_.matrix) + .minItems(_.matrix, 1)