aboutsummaryrefslogtreecommitdiff
path: root/src/schemas/parse.ts
blob: 5b43fd9dabddb77e0541cfc395c6ebbfcd51f587 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import type { Static, TSchema } from "typebox";
import type { Validator } from "typebox/compile";
import { type Result, err, ok } from "../util/result";

export const parseJson = <S extends TSchema>(
  raw: string,
  validator: Validator<{}, S>,
): Result<Static<S>, string> => {
  let parsed: unknown;
  try {
    parsed = JSON.parse(raw);
  } catch (e) {
    return err(`JSON parse failed: ${e instanceof Error ? e.message : String(e)}`);
  }
  if (!validator.Check(parsed)) {
    const messages = validator
      .Errors(parsed)
      .map((x) => x.message)
      .join("; ");
    return err(messages.length > 0 ? messages : "JSON did not match the expected shape");
  }
  return ok(parsed);
};