Skip to content

Commit 9ad387b

Browse files
committed
simplify error aggregation
1 parent 77be855 commit 9ad387b

File tree

3 files changed

+21
-50
lines changed

3 files changed

+21
-50
lines changed

misc/misc.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,6 @@ export function repeatArray<T>(element: T, count: number): ReadonlyArray<T> {
2424
export function repeatWithSpace(text: string, count: number): string {
2525
return repeatArray(text, count).join(" ");
2626
}
27-
export function flattenError(error: unknown): ReadonlyArray<unknown> {
28-
if (error instanceof AggregateError) {
29-
return error.errors.flatMap(flattenError);
30-
} else {
31-
return [error];
32-
}
33-
}
3427
export function throwError(error: unknown): never {
3528
throw error;
3629
}

src/array_result.ts

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { flattenError, nullableAsArray } from "../misc/misc.ts";
1+
import { nullableAsArray } from "../misc/misc.ts";
22

33
export type ArrayResultOptions = {
44
cause: unknown;
@@ -132,40 +132,23 @@ export class ArrayResult<T> {
132132
try {
133133
return arrayResult();
134134
} catch (error) {
135-
return ArrayResult.errors(extractArrayResultError(flattenError(error)));
135+
return ArrayResult.errors(extractArrayResultError(error));
136136
}
137137
}
138138
}
139-
type Errors =
140-
| Readonly<{ type: "array result"; errors: ReadonlyArray<ArrayResultError> }>
141-
| Readonly<{ type: "outside"; errors: ReadonlyArray<unknown> }>;
142139
export function extractArrayResultError(
143-
errors: ReadonlyArray<unknown>,
140+
error: unknown,
144141
): ReadonlyArray<ArrayResultError> {
145-
const aggregate = errors.reduce<Errors>(
146-
(errors, error) => {
147-
switch (errors.type) {
148-
case "array result":
149-
if (error instanceof ArrayResultError) {
150-
return { type: "array result", errors: [...errors.errors, error] };
151-
} else {
152-
return { type: "outside", errors: [error] };
153-
}
154-
case "outside": {
155-
const moreError = error instanceof ArrayResultError ? [] : [error];
156-
return { type: "outside", errors: [...errors.errors, ...moreError] };
157-
}
158-
}
159-
},
160-
{
161-
type: "array result",
162-
errors: [],
163-
},
164-
);
165-
switch (aggregate.type) {
166-
case "array result":
167-
return aggregate.errors;
168-
case "outside":
169-
throw new AggregateError(aggregate.errors);
142+
if (error instanceof ArrayResultError) {
143+
return [error];
144+
} else if (error instanceof AggregateError) {
145+
const { errors } = error;
146+
if (
147+
errors.length > 1 &&
148+
errors.every((error) => error instanceof ArrayResultError)
149+
) {
150+
return errors;
151+
}
170152
}
153+
throw error;
171154
}

src/parser/filter.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { compound, flattenError, throwError } from "../../misc/misc.ts";
1+
import { compound, throwError } from "../../misc/misc.ts";
22
import { extractArrayResultError } from "../array_result.ts";
33
import { settings } from "../settings.ts";
44
import {
@@ -373,23 +373,18 @@ export function filter<T>(
373373
return [];
374374
}
375375
} catch (error) {
376-
return flattenError(error);
376+
return extractArrayResultError(error);
377377
}
378378
},
379379
);
380380
if (result.every((result) => result == null)) {
381381
return true;
382382
} else {
383-
const errors = extractArrayResultError(
384-
result.flatMap((result) => result ?? []),
385-
);
386-
switch (errors.length) {
387-
case 0:
388-
return false;
389-
case 1:
390-
throw errors[0];
391-
default:
392-
throw new AggregateError(errors);
383+
const errors = result.flatMap((result) => result ?? []);
384+
if (errors.length === 0) {
385+
return false;
386+
} else {
387+
throw new AggregateError(errors);
393388
}
394389
}
395390
};

0 commit comments

Comments
 (0)