A crazy man's effect-agnostic validations for Scala DTOs. Mostly extra syntax for cats' parMapN that's less red-squiggly in IntelliJ IDEA.
Warning: this library is as experimental as they come (it doesn't even have a logo yet). You're highly discouraged from using it in production, although you might want to check it out in side projects or contribute to the upcoming planning for a more stable API.
"com.kubukoz" %% "vivalidi" % "x.x.x"
Replace x.x.x with the version you want (the latest non-snapshot release version can be seen on the top of this README).
The library is cross-compiled to Scala 2.12 and Scala.js - for the latter, replace %%
with %%%
.
Coming soon - until then, please enjoy this example from tests:
import vivalidi.Vivalidi, vivalidi.syntax.all._
type EitherNelT[F[_], E, T] = EitherT[F, NonEmptyList[E], T]
type E[A] = EitherNelT[IO, String, A]
val validation: Person => EitherNelT[IO, String, Person] = Vivalidi[Person, E].init
.sync(_.id)(_ => "wrong id".leftNel[Long])
.just(_.name)
.async(_.age)(_ => "wrong age".leftNel[Int].liftTo[E])
.to[Person]
.run
val person = Person(1, "hello", 21)
validation(person).value.unsafeRunSync()
tl;dr CreateV[_] : Applicative
- so far the validators (e.g. validateLength
, a custom function taking String and returning
CreateV[String]
) are responsible for raising errors, but in the future there might be no type parameter for errors, just
an appropriate MonadError
context bound. F[_]
is just an applicative (like Future
), and TransactionToCreate
is
the input type (which toCreate
matches).
- Can I use this in production?
- Does this have any external dependencies?
Yes, there's a direct dependency on cats-core
and shapeless
.
- Tests?
lmao