https://github.com/kennethnym/trycat
trycat is a lightweight, type-safe, zero-dependency implementation of the Result type
https://github.com/kennethnym/trycat
error-handling result result-type rust-result
Last synced: about 1 month ago
JSON representation
trycat is a lightweight, type-safe, zero-dependency implementation of the Result type
- Host: GitHub
- URL: https://github.com/kennethnym/trycat
- Owner: kennethnym
- License: mit
- Created: 2024-04-29T01:59:14.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2024-05-02T22:52:58.000Z (about 1 year ago)
- Last Synced: 2025-03-28T16:51:16.677Z (about 2 months ago)
- Topics: error-handling, result, result-type, rust-result
- Language: TypeScript
- Homepage: https://kennethnym.github.io/trycat/
- Size: 92.8 KB
- Stars: 5
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# trycat
`trycat` is a lightweight, type-safe, zero-dependency implementation of the [`Result` type](https://doc.rust-lang.org/std/result/enum.Result.html) 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`
```ts
import * as fs from "node:fs"
import { type Result, trys } from "trycat"function readTextFileSync(path: string): Result {
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:
```ts
import * as fs from "node:fs"
import { type Result, ok, err } from "trycat"function readTextFileSync(path: string): Result {
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`:
```ts
type ApiError = "InternalError" | "NetworkError" | "ServerError" | "UnexpectedResponse"const WeatherSchema = z.object({ ... })
type Weather = z.inferasync function fetchWeather(): Promise> {
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.