Compare commits
No commits in common. "635d2aea06e6548b80b679411fa128135327602c" and "b56dcd06391814f7eca4d6fc8ce51d80c80d40d7" have entirely different histories.
635d2aea06
...
b56dcd0639
12
README.md
12
README.md
|
@ -1,21 +1,17 @@
|
|||
# Grip
|
||||
|
||||
|
||||
[A take on Go Style Error Handling In JavaScript](https://dev.to/nesterow/a-take-on-go-style-error-handling-in-javascript-577)
|
||||
|
||||
Simplified result/error handling for JavaScript.
|
||||
Grip always returns a consistent call result ready to be handled.
|
||||
It makes the control flow similar to that of Golang, but doesn't force you to make additional null checks or create transitional variables to hold error results.
|
||||
|
||||
|
||||
Instead of returning a nullish error, Grip always returns a consistent status object:
|
||||
|
||||
```javascript
|
||||
const [value, status] = grip(callable)
|
||||
if (status.of(MySpecificError)) {
|
||||
if (status.Of(MySpecificError)) {
|
||||
// handle specific error
|
||||
}
|
||||
if (status.fail()) {
|
||||
if (status.Fail()) {
|
||||
// handle any error
|
||||
}
|
||||
```
|
||||
|
@ -24,10 +20,10 @@ The call result is better than tuple:
|
|||
|
||||
```javascript
|
||||
const result = grip(callable)
|
||||
if (result.fail()) {
|
||||
if (result.Fail()) {
|
||||
// handle any error
|
||||
}
|
||||
if (result.of(MySpecificError)) {
|
||||
if (result.Of(MySpecificError)) {
|
||||
// handle specific error
|
||||
}
|
||||
|
||||
|
|
30
dist/grip.js
vendored
30
dist/grip.js
vendored
|
@ -18,21 +18,12 @@ class Err extends Error {
|
|||
Ok() {
|
||||
return false;
|
||||
}
|
||||
ok() {
|
||||
return this.Ok();
|
||||
}
|
||||
Fail() {
|
||||
return true;
|
||||
}
|
||||
fail() {
|
||||
return this.Fail();
|
||||
}
|
||||
Of(cls) {
|
||||
return this.cause instanceof cls || this instanceof cls;
|
||||
}
|
||||
of(cls) {
|
||||
return this.Of(cls);
|
||||
}
|
||||
static fromCatch(error) {
|
||||
const e = new Err(typeof error === "string" ? error : error.message);
|
||||
e.cause = error;
|
||||
|
@ -45,21 +36,12 @@ class Ok {
|
|||
Ok() {
|
||||
return true;
|
||||
}
|
||||
ok() {
|
||||
return this.Ok();
|
||||
}
|
||||
Fail() {
|
||||
return false;
|
||||
}
|
||||
fail() {
|
||||
return this.Fail();
|
||||
}
|
||||
Of(cls) {
|
||||
return this instanceof cls;
|
||||
}
|
||||
of(cls) {
|
||||
return this.Of(cls);
|
||||
}
|
||||
toString() {
|
||||
return "Ok";
|
||||
}
|
||||
|
@ -82,21 +64,12 @@ class Result extends Array {
|
|||
Ok() {
|
||||
return this[1].Ok();
|
||||
}
|
||||
ok() {
|
||||
return this.Ok();
|
||||
}
|
||||
Fail() {
|
||||
return this[1].Fail();
|
||||
}
|
||||
fail() {
|
||||
return this.Fail();
|
||||
}
|
||||
Of(cls) {
|
||||
return this[1].Of(cls);
|
||||
}
|
||||
of(cls) {
|
||||
return this.Of(cls);
|
||||
}
|
||||
Iter() {
|
||||
const value = this.value;
|
||||
const that = this;
|
||||
|
@ -119,9 +92,6 @@ class Result extends Array {
|
|||
}
|
||||
};
|
||||
}
|
||||
iter() {
|
||||
return this.Iter();
|
||||
}
|
||||
}
|
||||
var promise = (result) => {
|
||||
return result.then((res) => new Result(res, new Ok)).catch((err) => new Result(null, Err.fromCatch(err)));
|
||||
|
|
|
@ -49,7 +49,7 @@ test("fetch err", async () => {
|
|||
const [result, status] = await grip(fetch("https://localhost:30012"));
|
||||
expect(status.Ok()).toBe(false);
|
||||
expect(result === null).toBe(true);
|
||||
expect(status.of(Error)).toBe(true);
|
||||
expect(status.Of(Error)).toBe(true);
|
||||
});
|
||||
|
||||
test("fetch json", async () => {
|
||||
|
|
46
grip.ts
46
grip.ts
|
@ -2,38 +2,20 @@ interface Status {
|
|||
message?: string;
|
||||
cause?: any;
|
||||
Ok(): boolean;
|
||||
/* alias Ok */
|
||||
ok(): boolean;
|
||||
Fail(): boolean;
|
||||
/* alias Fail */
|
||||
fail(): boolean;
|
||||
Of(cls: any): boolean;
|
||||
/* alias Of */
|
||||
of(cls: any): boolean;
|
||||
}
|
||||
|
||||
export class Err extends Error {
|
||||
Ok() {
|
||||
return false;
|
||||
}
|
||||
/* alias Ok */
|
||||
ok() {
|
||||
return this.Ok();
|
||||
}
|
||||
Fail() {
|
||||
return true;
|
||||
}
|
||||
/* alias Fail */
|
||||
fail() {
|
||||
return this.Fail();
|
||||
}
|
||||
Of(cls: any) {
|
||||
return this.cause instanceof cls || this instanceof cls;
|
||||
}
|
||||
/* alias Of */
|
||||
of(cls: any) {
|
||||
return this.Of(cls);
|
||||
}
|
||||
static fromCatch(error: any) {
|
||||
const e = new Err(typeof error === "string" ? error : error.message);
|
||||
e.cause = error;
|
||||
|
@ -46,24 +28,12 @@ export class Ok {
|
|||
Ok() {
|
||||
return true;
|
||||
}
|
||||
/* alias Ok */
|
||||
ok() {
|
||||
return this.Ok();
|
||||
}
|
||||
Fail() {
|
||||
return false;
|
||||
}
|
||||
/* alias Fail */
|
||||
fail() {
|
||||
return this.Fail();
|
||||
}
|
||||
Of(cls: any) {
|
||||
return this instanceof cls;
|
||||
}
|
||||
/* alias Of */
|
||||
of(cls: any) {
|
||||
return this.Of(cls);
|
||||
}
|
||||
toString() {
|
||||
return "Ok";
|
||||
}
|
||||
|
@ -96,24 +66,12 @@ class Result<T> extends Array<T | Status> implements IResult<T> {
|
|||
Ok() {
|
||||
return (this[1] as Status).Ok();
|
||||
}
|
||||
/* alias Ok */
|
||||
ok() {
|
||||
return this.Ok();
|
||||
}
|
||||
Fail() {
|
||||
return (this[1] as Status).Fail();
|
||||
}
|
||||
/* alias Fail */
|
||||
fail() {
|
||||
return this.Fail();
|
||||
}
|
||||
Of(cls: any) {
|
||||
return (this[1] as Status).Of(cls);
|
||||
}
|
||||
/* alias Of */
|
||||
of(cls: any) {
|
||||
return this.Of(cls);
|
||||
}
|
||||
Iter() {
|
||||
const value = this.value;
|
||||
const that = this;
|
||||
|
@ -142,10 +100,6 @@ class Result<T> extends Array<T | Status> implements IResult<T> {
|
|||
},
|
||||
};
|
||||
}
|
||||
/* alias Iter */
|
||||
iter() {
|
||||
return this.Iter();
|
||||
}
|
||||
}
|
||||
|
||||
type Unwrap<T> =
|
||||
|
|
Loading…
Reference in a new issue