FieldLens
Library is called Fields solely because it is built around Field data type.
But creating Field instance for every validation can be memory consuming,
so the new modules fields-lens was introduced built around lenses.
FieldLens[P, +V] has path of type FieldPath and selector of type P => V.
All validations are defined through syntax available for FieldLens
Syntaxβ
Createβ
import fields.lens.FieldsDsl.default._
case class Request(name: String)
val request = Request("Ann")
// request: Request = Request("Ann")
FieldLens[Request]
// res0: FieldLens[Request, Request] = Strict(
// path = .,
// selector = fields.lens.FieldLens$$$Lambda/0x0000007002eee548@25cfebf3
// )
FieldLens[Request](FieldPath.fromPath("request"))
// res1: FieldLens[Request, Request] = Strict(
// path = .request,
// selector = fields.lens.FieldLens$$$Lambda/0x0000007002efe5a8@115fd7ae
// )
FieldLens[Request].sub(_.name)
// res2: FieldLens[Request, String] = Strict(
// path = .name,
// selector = scala.Function1$$Lambda/0x0000007002ee19b0@99485a2
// )
Transformβ
case class B()
case class A(b: B)
val a = FieldLens[A]
// a: FieldLens[A, A] = Strict(
// path = .,
// selector = fields.lens.FieldLens$$$Lambda/0x0000007002eee548@25cfebf3
// )
a.sub(_.b)
// res3: FieldLens[A, B] = Strict(
// path = .b,
// selector = scala.Function1$$Lambda/0x0000007002ee19b0@3ddee0e0
// )
a.down("b", _.b)
// res4: FieldLens[A, B] = Strict(
// path = .b,
// selector = scala.Function1$$Lambda/0x0000007002ee19b0@679404db
// )
a.map(_.b)
// res5: FieldLens[A, B] = Strict(
// path = .,
// selector = scala.Function1$$Lambda/0x0000007002ee19b0@8995d20
// )
a.mapPath(_ + "A")
// res6: FieldLens[A, A] = Strict(
// path = .A,
// selector = fields.lens.FieldLens$$$Lambda/0x0000007002eee548@25cfebf3
// )
a.named("A")
// res7: FieldLens[A, A] = Strict(
// path = .A,
// selector = fields.lens.FieldLens$$$Lambda/0x0000007002eee548@25cfebf3
// )
a.withPath(FieldPath.fromPath("b"))
// res8: FieldLens[A, A] = Strict(
// path = .b,
// selector = fields.lens.FieldLens$$$Lambda/0x0000007002eee548@25cfebf3
// )
a.withSelector(_.b)
// res9: FieldLens[A, B] = Strict(
// path = .,
// selector = repl.MdocSession$MdocApp$$Lambda/0x0000007002f020c8@258d7004
// )