aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Effect/json.ts
blob: b905cc41c595481d56f413e2b3a42d26b0989476 (plain) (blame)
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
import { Effect, Result } from "effect";

export const parseJsonStringEffect = (value: string) =>
	Effect.try({
		try: () => JSON.parse(value) as unknown,
		catch: (cause) => new Error("Invalid JSON payload", { cause }),
	});

export const parseJsonStringEither = (value: string) =>
	Result.try({
		try: () => Effect.runSync(parseJsonStringEffect(value)),
		catch: (cause) =>
			cause instanceof Error
				? cause
				: new Error("Failed to parse JSON payload", { cause }),
	});

export const parseJsonStringOrThrow = <T = unknown>(value: string): T =>
	Result.getOrThrow(parseJsonStringEither(value)) as T;

export const parseJsonStringOrDefault = <T>(value: string, fallback: T): T => {
	const parsed = parseJsonStringEither(value);

	return Result.match(parsed, {
		onSuccess: (decoded) => decoded as T,
		onFailure: () => fallback,
	});
};