• English
  • no-throw-in-callback

    Disallows throw statements inside callbacks passed to @praha/byethrow functions such as Result.andThen, Result.map, etc.

    Rule details

    Throwing inside a @praha/byethrow callback breaks the Result contract, not an exception. Use Result.fail() to represent errors instead, keeping error handling explicit and composable.

    Incorrect

    import { 
    import Result
    Result
    } from '@praha/byethrow';
    // ❌ throwing inside a callback const
    const result: Result.Result<number, never>
    result
    =
    import Result
    Result
    .
    const pipe: <Result.Result<32, never>, Result.Result<number, never>>(a: Result.Result<32, never>, ab: (a: Result.Result<32, never>) => Result.Result<number, never>) => Result.Result<number, never> (+25 overloads)
    pipe
    (
    import Result
    Result
    .
    const succeed: <32>(value: 32) => Result.Result<32, never> (+1 overload)
    succeed
    (32),
    import Result
    Result
    .
    const andThen: <Result.Result<32, never>, Result.Result<number, never>>(fn: (a: 32) => Result.Result<number, never>) => (result: Result.Result<32, never>) => Result.Result<number, never> (+1 overload)
    andThen
    ((
    value: 32
    value
    ) => {
    if (
    value: 32
    value
    < 0) throw new
    var RangeError: RangeErrorConstructor
    new (message?: string, options?: ErrorOptions) => RangeError (+3 overloads)
    RangeError
    ('negative value');
    return
    import Result
    Result
    .
    const succeed: <number>(value: number) => Result.Result<number, never> (+1 overload)
    succeed
    (
    value: 32
    value
    * 2);
    }), );

    Correct

    import { 
    import Result
    Result
    } from '@praha/byethrow';
    // ✅ returning a failure Result const
    const result: Result.Result<number, NegativeValueError>
    result
    =
    import Result
    Result
    .
    const pipe: <Result.Result<32, never>, Result.Result<number, NegativeValueError>>(a: Result.Result<32, never>, ab: (a: Result.Result<32, never>) => Result.Result<number, NegativeValueError>) => Result.Result<number, NegativeValueError> (+25 overloads)
    pipe
    (
    import Result
    Result
    .
    const succeed: <32>(value: 32) => Result.Result<32, never> (+1 overload)
    succeed
    (32),
    import Result
    Result
    .
    const andThen: <Result.Result<32, never>, Result.Failure<NegativeValueError> | Result.Success<number>>(fn: (a: 32) => Result.Failure<NegativeValueError> | Result.Success<number>) => (result: Result.Result<32, never>) => Result.Result<number, NegativeValueError> (+1 overload)
    andThen
    ((
    value: 32
    value
    ) => {
    if (
    value: 32
    value
    < 0) return
    import Result
    Result
    .
    const fail: <NegativeValueError>(error: NegativeValueError) => Result.Result<never, NegativeValueError> (+1 overload)
    fail
    (new
    constructor NegativeValueError(message?: string, options?: ErrorOptions): NegativeValueError (+1 overload)
    NegativeValueError
    ());
    return
    import Result
    Result
    .
    const succeed: <number>(value: number) => Result.Result<number, never> (+1 overload)
    succeed
    (
    value: 32
    value
    * 2);
    }), );