Skip to content

Commit 3fc7604

Browse files
committed
Add optional message argument to Result.getOrThrow and improve default error message
1 parent 507a751 commit 3fc7604

File tree

4 files changed

+32
-18
lines changed

4 files changed

+32
-18
lines changed

lib/es6/Stdlib_Result.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11

22

3+
import * as Stdlib_JsError from "./Stdlib_JsError.js";
34

4-
function getOrThrow(x) {
5+
function getOrThrow(x, message) {
56
if (x.TAG === "Ok") {
67
return x._0;
8+
} else {
9+
return Stdlib_JsError.panic(message !== undefined ? message : "Result.getOrThrow called for Error value");
710
}
8-
throw {
9-
RE_EXN_ID: "Not_found",
10-
Error: new Error()
11-
};
1211
}
1312

1413
function mapOr(opt, $$default, f) {

lib/js/Stdlib_Result.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
'use strict';
22

3+
let Stdlib_JsError = require("./Stdlib_JsError.js");
34

4-
function getOrThrow(x) {
5+
function getOrThrow(x, message) {
56
if (x.TAG === "Ok") {
67
return x._0;
8+
} else {
9+
return Stdlib_JsError.panic(message !== undefined ? message : "Result.getOrThrow called for Error value");
710
}
8-
throw {
9-
RE_EXN_ID: "Not_found",
10-
Error: new Error()
11-
};
1211
}
1312

1413
function mapOr(opt, $$default, f) {

runtime/Stdlib_Result.res

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,16 @@
2323
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
2424
type t<'res, 'err> = result<'res, 'err> = Ok('res) | Error('err)
2525

26-
let getOrThrow = x =>
26+
let getOrThrow = (x, ~message=?) =>
2727
switch x {
2828
| Ok(x) => x
29-
| Error(_) => throw(Not_found)
29+
| Error(_) =>
30+
Stdlib_JsError.panic(
31+
switch message {
32+
| None => "Result.getOrThrow called for Error value"
33+
| Some(message) => message
34+
},
35+
)
3036
}
3137

3238
let getExn = getOrThrow

runtime/Stdlib_Result.resi

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,33 +48,43 @@
4848
type t<'res, 'err> = result<'res, 'err> = Ok('res) | Error('err)
4949

5050
/**
51-
`getExn(res)`: when `res` is `Ok(n)`, returns `n` when `res` is `Error(m)`, raise an exception
51+
`getExn(res, ~message=?)` returns `n` if `res` is `Ok(n)`, otherwise throws an exception with the message provided, or a generic message if no message was provided.
5252
5353
```res example
5454
Result.getExn(Result.Ok(42)) == 42
5555
5656
switch Result.getExn(Error("Invalid data")) {
57-
| exception Not_found => assert(true)
57+
| exception _ => assert(true)
58+
| _ => assert(false)
59+
}
60+
61+
switch Result.getExn(Error("Invalid data"), ~message="was Error!") {
62+
| exception _ => assert(true) // Throws a JsError with the message "was Error!"
5863
| _ => assert(false)
5964
}
6065
```
6166
*/
6267
@deprecated("Use 'getOrThrow' instead")
63-
let getExn: result<'a, 'b> => 'a
68+
let getExn: (result<'a, 'b>, ~message: string=?) => 'a
6469

6570
/**
66-
`getOrThrow(res)`: when `res` is `Ok(n)`, returns `n` when `res` is `Error(m)`, raise an exception
71+
`getOrThrow(res, ~message=?)` returns `n` if `res` is `Ok(n)`, otherwise throws an exception with the message provided, or a generic message if no message was provided.
6772
6873
```res example
6974
Result.getOrThrow(Result.Ok(42)) == 42
7075
7176
switch Result.getOrThrow(Error("Invalid data")) {
72-
| exception Not_found => assert(true)
77+
| exception _ => assert(true)
78+
| _ => assert(false)
79+
}
80+
81+
switch Result.getOrThrow(Error("Invalid data"), ~message="was Error!") {
82+
| exception _ => assert(true) // Throws a JsError with the message "was Error!"
7383
| _ => assert(false)
7484
}
7585
```
7686
*/
77-
let getOrThrow: result<'a, 'b> => 'a
87+
let getOrThrow: (result<'a, 'b>, ~message: string=?) => 'a
7888

7989
/**
8090
`mapOr(res, default, f)`: When res is `Ok(n)`, returns `f(n)`, otherwise `default`.

0 commit comments

Comments
 (0)