trycat
TypeScript icon, indicating that this package has built-in type declarations

0.2.4 • Public • Published

trycat

trycat is a lightweight, type-safe, zero-dependency implementation of the Result type in Rust. It provides utilities to replace try-catch error handling with Result that provides various methods to handle errors in a more type-safe, explicit manner.

Usage and Example

trycat provides two functions, trys and tryp, that returns results of throwable synchronous and asynchronous operations as either Ok or Err respectively.

trys

import * as fs from "node:fs"
import { type Result, trys } from "trycat"

function readTextFileSync(path: string): Result<string, string> {
  return trys(() => {
    return fs.readFileSync(path, "utf-8")
  }).mapErr((err) => {
    if (err instance of Error) {
      return err.message
    }
    return "unknown"
  })
}

const rows = readTextFileSync("./data.csv")
  .mapOr([], (content) => content.split('\n').map((line) => line.split(" ")))

You can also use the ok and err functions manually to create an Ok value or an Err value:

import * as fs from "node:fs"
import { type Result, ok, err } from "trycat"

function readTextFileSync(path: string): Result<string, string> {
  try {
    const content = fs.readFileSync(path, "utf-8")
    return ok(content)
  } catch (err: unknown) {
    if (err instanceof Error) {
      return err(err.message)
    }
    return err("unknown")
  }
}

const rows = readTextFileSync("./data.csv")
  .mapOr([], (content) => content.split('\n').map((line) => line.split(" ")))

tryp

tryp is an asynchronous version of trys:

type ApiError = "InternalError" | "NetworkError" | "ServerError" | "UnexpectedResponse"

const WeatherSchema = z.object({ ... })
type Weather = z.infer<typeof WeatherSchema>

async function fetchWeather(): Promise<Result<Weather, ApiError>> {
  const res = await tryp(fetch("/api/weather"))
  if (res.isErr()) {
    return err("NetworkError")
  }
  if (res.value.status === 500) {
    return err("ServerError")
  }

  const json = await tryp(res.json())
  if (json.isErr()) {
    return err("UnexpectedResponse")
  }

  const weather = trys(() => WeatherSchema.parse(json)).mapErr((error): ApiError => {
    if (error instanceof ZodError) {
      return "UnexpectedResponse"
    }
    return "InternalError"
  })

  if (weather.isErr()) {
    return err(weather.error)
  }

  return ok(weather.value)
}

Matching Rust's Implementation

The goal of this library is to match Rust's Result as close as possible. If there is anything missing, please file an issue.

Package Sidebar

Install

npm i trycat

Weekly Downloads

2

Version

0.2.4

License

MIT

Unpacked Size

30.3 kB

Total Files

7

Last publish

Collaborators

  • kennethnym