soulbeaver
09/30/2021, 12:15 PMpersonalData.validate().zip(
Semigroup.nonEmptyList<ValidationError>(),
taxData.validate(),
productData.validate()
) { personData, taxData, productData -> Person(...) }
However, all of the sub-objects have a different type:
• personalData.validate() -> ValidatedNel<ValidationError, PersonalData>
• taxData.validate() -> ValidatedNel<ValidationError, TaxData>
Which means that instead of the above I'm currently doing a bunch of manual checks like so:
val validatedPersonalData = when (val result = personalData.validate()) {
is Valid -> result.value
is Invalid -> validationErrors.addAll(result.value)
}
Over and over again until finally
return if (validationErrors.isNotEmpty())
validationErrors.invalidNel()
else
Person(validatedPersonalData, validatedTaxData, validatedProductData)
Is there a better way of doing this?mitch
09/30/2021, 12:29 PMdata class Person(val personalData: PersonalData, val taxData: TaxData, val productData: ProductData)
val validatedPersonalData: ValidatedNel<ValidationError, PersonalData> = personalData.validate()
val validatedTaxData: ValidatedNel<ValidationError, TaxData> = taxData.validate()
val validatedProductData: ValidatedNel<ValidationError, ProductData> = productData.validate()
val validatedPerson: ValidatedNel<ValidationError, Person> = ...
I wonder how come zip doesn’t work?
val validatedPerson: ValidatedNel<ValidationError, Person> =
personalData.validate().zip(
taxData.validate(),
productData.validate()
) { personData, taxData, productData ->
Person(personData, taxData, productData)
}
soulbeaver
09/30/2021, 12:33 PMpersonalData.validate().zip(
Semigroup.nonEmptyList<ValidationError>(),
taxData.validate(),
productData.validate()
)
I saw a bunch of errors relating to TypeVariable<A> and such in the code and assumed it was because of the ValidatedNel response types I had declared. Of course it was complaining that I was missing the final lambda parameter.soulbeaver
09/30/2021, 12:33 PMmitch
09/30/2021, 12:34 PM