CHAN.RUN

ensure

trySync

trySync()

Call Signature

function trySync<TArgs, T, TErrors>(fn, ...args): SyncResult<T, InferFaultErrors<TErrors>>;

Defined in: src/try.ts

Run sync code, return a discriminated result — never throws.

Pass a declared function directly to get typed errors:

const parse = declares([ValidationError], (raw: string) => JSON.parse(raw));
const result = trySync(parse, input);
// result.error is ValidationError, not unknown

Or wrap any expression in a lambda:

const result = trySync(() => JSON.parse(raw));
// result.error is unknown

Type Parameters

Type Parameter
TArgs extends unknown[]
T
TErrors extends NamedFaultErrorClass<string>[]

Parameters

ParameterType
fnDeclaredFn<TArgs, T, TErrors>
...argsTArgs

Returns

SyncResult<T, InferFaultErrors<TErrors>>

Examples

const result = trySync(() => JSON.parse(userInput));
if (!result.ok) {
  console.error("Invalid JSON:", result.error);
  return fallbackConfig;
}
return result.data;
function decodeJwtPayload(token: string): Record<string, unknown> | null {
  const result = trySync(() => JSON.parse(atob(token.split(".")[1])));
  return result.ok ? result.data : null;
}
const ConfigError = defineError("ConfigError");

const loadConfig = declares([ConfigError], (path: string) => {
  const raw = fs.readFileSync(path, "utf-8");
  const result = trySync(() => JSON.parse(raw));
  if (!result.ok) fault(ConfigError, `Invalid config: ${path}`, { cause: result.error });
  return result.data as AppConfig;
});

const result = trySync(loadConfig, "./config.json");
// result.error is ConfigError, not unknown
function getStoredTheme(): Theme | null {
  const result = trySync(() => JSON.parse(localStorage.getItem("theme") ?? ""));
  return result.ok ? result.data : null;
}

Call Signature

function trySync<T>(fn): SyncResult<T>;

Defined in: src/try.ts

Run sync code, return a discriminated result — never throws.

Pass a declared function directly to get typed errors:

const parse = declares([ValidationError], (raw: string) => JSON.parse(raw));
const result = trySync(parse, input);
// result.error is ValidationError, not unknown

Or wrap any expression in a lambda:

const result = trySync(() => JSON.parse(raw));
// result.error is unknown

Type Parameters

Type Parameter
T

Parameters

ParameterType
fn() => T

Returns

SyncResult<T>

Examples

const result = trySync(() => JSON.parse(userInput));
if (!result.ok) {
  console.error("Invalid JSON:", result.error);
  return fallbackConfig;
}
return result.data;
function decodeJwtPayload(token: string): Record<string, unknown> | null {
  const result = trySync(() => JSON.parse(atob(token.split(".")[1])));
  return result.ok ? result.data : null;
}
const ConfigError = defineError("ConfigError");

const loadConfig = declares([ConfigError], (path: string) => {
  const raw = fs.readFileSync(path, "utf-8");
  const result = trySync(() => JSON.parse(raw));
  if (!result.ok) fault(ConfigError, `Invalid config: ${path}`, { cause: result.error });
  return result.data as AppConfig;
});

const result = trySync(loadConfig, "./config.json");
// result.error is ConfigError, not unknown
function getStoredTheme(): Theme | null {
  const result = trySync(() => JSON.parse(localStorage.getItem("theme") ?? ""));
  return result.ok ? result.data : null;
}