J'essaie de modifier un code qui utilise la validation des chats, quelque chose comme.. :
case class Example(text: String, image: String)
case class ValidExample(text: String, image: String)
import cats.data.Validated._
import cats.implicits._
def validText(text: String) = if (text.nonEmpty) text.valid else invalid(-1)
def validImage(image: String) = if (image.endsWith(".png")) image.valid else invalid(-1)
val e = Example("test", "test.png")
(validText(e.text), validImage(e.image)).mapN(ValidExample)
Ce qui fonctionne bien.
Mais mon changement nécessite que le champ image soit une option, comme :
case class Example(text: String, image: Option[String])
case class ValidExample(text: String, image: Option[String])
import cats.data.Validated._
import cats.implicits._
def validText(text: String) = if (text.nonEmpty) text.valid else invalid(-1)
def validImage(image: String) = if (image.endsWith(".png")) image.valid else invalid(-1)
val e = Example("test", Some("test.png"))
(validText(e.text), e.image.map(validImage)).mapN(ValidExample)
Avec cela, le mapN échoue parce que les types diffèrent soudainement, dit-il :
value mapN is not a member of (cats.data.Validated[Int,String], Option[cats.data.Validated[Int,String]])
Je veux qu'il ne valide que si la valeur existe. Il doit donc faire partie du résultat de la validation si la valeur est présente, mais ignorer le champ dans le cas contraire. Je sais qu'il existe des moyens de combiner les validations, mais dans mon code réel, cela serait beaucoup plus compliqué que quelque chose comme ceci.
Existe-t-il un moyen de le faire de manière simple ? Je n'ai rien trouvé à ce sujet dans la documentation ou dans la recherche.
Merci pour votre aide !