aboutsummaryrefslogtreecommitdiff
path: root/src/util/guards.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/guards.ts')
-rw-r--r--src/util/guards.ts30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/util/guards.ts b/src/util/guards.ts
new file mode 100644
index 0000000..2744c68
--- /dev/null
+++ b/src/util/guards.ts
@@ -0,0 +1,30 @@
+export const isRecord = (v: unknown): v is Readonly<Record<string, unknown>> =>
+ typeof v === "object" && v !== null && !Array.isArray(v);
+
+export const asRecord = (v: unknown): Readonly<Record<string, unknown>> | undefined =>
+ isRecord(v) ? v : undefined;
+
+export const asString = (v: unknown): string | undefined => (typeof v === "string" ? v : undefined);
+
+export const asNumber = (v: unknown): number | undefined => (typeof v === "number" ? v : undefined);
+
+export const asBoolean = (v: unknown): boolean | undefined => (typeof v === "boolean" ? v : undefined);
+
+export const asArrayOf = <T>(
+ v: unknown,
+ item: (x: unknown) => T | undefined,
+): ReadonlyArray<T> | undefined => {
+ if (!Array.isArray(v)) return undefined;
+ const out: T[] = [];
+ for (const x of v) {
+ const parsed = item(x);
+ if (parsed === undefined) return undefined;
+ out.push(parsed);
+ }
+ return out;
+};
+
+export const errnoCode = (e: unknown): string | undefined => {
+ if (!(e instanceof Error) || !("code" in e)) return undefined;
+ return asString(e.code);
+};