0

我目前正在学习使用 ArrowKT,并且我有以下代码用于验证输入。我试图一次收集所有错误并并行执行验证,因为它们中的大多数都是针对数据库完成的。

return Validated.applicativeNel<ValidationError>()
    .tupledN(
        validateA(input).toValidatedNel(),
        validateB(input).toValidatedNel(),
        validateC(input).toValidatedNel(),
        validateSlotIsFree(input).toValidatedNel(),
    )
    .fix()
    .map { (a, b, c, _) ->
        ...
    }

private suspend fun validateSlotIsFree(input: CreateDto): Validated<ValidationError.SlotUnavailable, Boolean> {
    val exists = appointmentRepository.existsBy...()
    return if (exists) true.valid() else ValidationError.SlotUnavailable.invalid()
}

有没有更好的方法来处理内部验证validateSlotIsFree?如果有效,我似乎被迫在右侧返回一些东西,但我不想这样做。我一直在寻找类似的东西,Option其中值将是错误,而为空则意味着验证已通过。这样做的问题是,它Validated.fromOption(...)会取值并将其应用于右侧,而我需要相反的情况。

4

1 回答 1

0

使用@LordRaydenMK 和@MLProgrammer-CiM 的答案,我找到了两个解决方案

private suspend fun validateSlotIsFree(input: CreateAppointmentDto): Validated<ValidationError.SlotUnavailable, Unit> {
    val exists = appointmentRepository.existsBy...()
    return if (exists) Valid(Unit) else ValidationError.SlotUnavailable.invalid()
}

以前我尝试过Nothing,但没有奏效。原因是它Nothing没有可能的价值,这就是为什么 usingnull不起作用。为了让它工作,null我不得不使用Nothing?.

首选第一个解决方案,因为 usingNothing?不正确,因为它实际上表示此函数不返回任何内容,同时它可以返回null

于 2021-03-03T09:21:17.430 回答