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);
};
|