arrow icon indicating copy to clipboard operation
arrow copied to clipboard

["Request"] Annotate Raise interface with @RaiseDSL

Open pema4 opened this issue 1 year ago • 1 comments

What version are you currently using? 1.2.4

What would you like to see?

According to DslMarker documentation, DSL marker is used to annotate interfaces/classes to limit visibility of their members in cases when there are multiple annotated receivers in scope. But currently in Arrow @RaiseDSL annotation is not present on the Raise interface, only on its methods and extensions. Consequently, this code compiles and runs:

import arrow.core.raise.*

fun main() {
    either<Int, Int> {
        withError<Int, String, _>(String::length) {
            raise("23423") // correctly resolves to [email protected]
            raise(42) // error type does not match inner Raise, but the call still resolves to [email protected]
        }
    }.also(::println)
    // prints Either.Left(5)
}

pema4 avatar May 02 '24 12:05 pema4

This is intentional behaviour. We want you to be able to set up multiple Raise instances, and be able to raise to any of them easily. This allows for easy error handling for multiple types

kyay10 avatar May 02 '24 12:05 kyay10

As mentioned by @kyay10, this is by design. Especially in accumulate environments, we want to still give the option to call the outer raise, to signal that accumulation has to stop.

serras avatar May 15 '24 10:05 serras