/ultres

Rust Result for JavaScript with Promise support

Primary LanguageJavaScriptMIT LicenseMIT

ultres

npm JavaScript Style Guide ci Coverage Status

Flexible and functional Result type for handling success and error cases.

Naming Things Is Hard™

Result > Res ult > ult Res > Ultres.

Yup.

Why

  • Zero dependencies: banana only, no gorilla or jungle whatsoever
  • ESM: native ESM package
  • CommonJS: support for older runtimes
  • TypeScript: first-class support
  • ES6: only used ES6 features
  • Familiar APIs: most of the idea were stolen from Rust
  • Promise support: added Promise/async support with the AsyncResult lib (see docs)

Install

npm i ultres

Quick example

import Result from 'ultres'
import AsyncResult from 'ultres/async'

const integer = value => {
  if (typeof value === 'bigint' || Number.isInteger(value)) {
    return Result.ok(value)
  } else if (typeof value === 'string' && /^[+-]\d+$/.test(value)) {
    return Result.ok(parseInt(value))
  } else {
    return Result.err(`Value ${value} is not an integer`)
  }
}

const double = value => value * 2

console.log(
  integer(5).map(double).unwrap() // 10
)

console.log(
  integer('-2').map(double).unwrap() // -4
)

console.log(
  integer(null).map(double).unwrapErr() // Value null is not an integer
)

const process = async value => {
  console.log(`process ${value} items`)
  return Result.ok(new Date())
}

const date = await AsyncResult.ok(integer(2))
  .andThen(process)
  .unwrap() // process 2 items

console.log(date) // 2024-08-22T15:19:04.830Z

const errInstance = await AsyncResult.ok(Promise.reject(new Error('Oh no')))
  .catchRejection()
  .unwrapErr()

console.log(errInstance.message) // Oh no

Docs

See docs website.

Donate

Thank you!

"Buy Me A Coffee"