#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);
}),
);