package net.thermetics.chargepoint.models import arrow.core.Either import arrow.core.EitherNel import arrow.core.raise.either import arrow.core.raise.ensure import java.util.* typealias ValidationResult = EitherNel sealed class ValidationError(override val message: String) : Error(message) { data object InvalidStationUuid : ValidationError("Invalid station ID") data object IdentifierTooShort : ValidationError("Invalid driver identifier - too short") data object IdentifierTooLong : ValidationError("Invalid driver identifier - too long") } fun validateStationUuid(stationUuid: String) = Either.catch { UUID.fromString(stationUuid) } .mapLeft { ValidationError.InvalidStationUuid } fun validateIdentifierNotShort(driver: DriverIdentifier) = either { ensure(driver.id.length >= 20) { ValidationError.IdentifierTooShort } driver } fun validateIdentifierNotLong(driver: DriverIdentifier) = either { ensure(driver.id.length <= 80) { ValidationError.IdentifierTooLong } driver } fun validateRequest(req: TransactionAuthRequest): EitherNel = Either.zipOrAccumulate( validateStationUuid(req.stationUuid), validateIdentifierNotShort(req.driverIdentifier), validateIdentifierNotLong(req.driverIdentifier), ) { _, _, _ -> req }