aboutsummaryrefslogtreecommitdiff
path: root/src/util/guards.ts
blob: 2744c683ff62da93c38ed5def8f994bcc7c6e5be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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);
};