@openally/result v1.3.0
Requirements
- Node.js v16 or higher
Getting Started
This package is available in the Node Package Repository and can be easily installed with npm or yarn.
$ npm i @openally/result
# or
$ yarn add @openally/resultUsage example
import fs from "node:fs";
import { Result, Ok, Err } from "@openally/result";
function readFile(path: string): Result<string, "invalid path"> {
if (existsSync(path)) {
return Ok(fs.readFileSync(path, "utf8"));
}
return Err("invalid path");
}
const fileContentStr = readFile("test.txt").unwrap();
console.log(fileContentStr);Where Result could be either an Ok or Err
type Result<T, E> = OkImpl<T> | ErrImpl<E>;You can combine that package with ts-pattern, here is an example;
return match(constraint.type)
.with("PRIMARY KEY", () => (
column.isPrimary ? None : Some({ columnName, type: "MISSING PK" })
))
.with("UNIQUE", () => helper
.getUniqueByColumnName(columnName)
.unwrapOr(Some({ columnName, type: "MISSING UNIQUE" }))
)
.with("FOREIGN KEY", () => helper
.getForeignKeyByColumnName(columnName)
.andThen((fk) => {
return helper.fkIsMatchingConstraint(fk, constraint) ?
Some({ columnName, type: "INVALID FK REFERENCE", constraint }) :
None;
})
.unwrapOr(Some({ columnName, type: "MISSING FK" }))
)
.otherwise(() => None) as Option<IConstraintDifference>;Where Option is defined as being Some value or None.
type Option<T> = SomeImpl<T> | NoneAPI
unwrap
Get value if Ok but throw if Err.
Ok(1).unwrap(); // 1
Err("oops").unwrap(); // Error: Tried to unwrap Error: oopsunwrapOr
Get value if Ok but fallback to a default value if Err (instead of throwing an Error).
Ok(1).unwrapOr(5); // 1
Err("oops").unwrapOr(5); // 5unwrapOrElse
Same as unwrapOr but use a lazy function for the default value.
Ok(1).unwrapOrElse(() => 5); // 1
Err("oops").unwrapOrElse(() => 5); // 5safeUnwrap
Same as unwrap but only available for Ok (useful for type safety).
map
Map value for Ok. Do nothing with Err (use mapErr instead).
Ok(1)
.map((v) => v + 1)
.unwrap(); // 2mapOr
Map and unwrap:
- Use default value for Error
- Use mapper for Ok
Ok(1)
.mapOr(1, (val) => val * 2); // 2
Err(new Error("oops"))
.mapOr(1, (val) => val * 2); // 1mapOrElse
Same as mapOr but use a callback returning error for default value
Err(new Error("oops"))
.mapOrElse(
(err) => err.message),
(val) => val * 2
); // oopsmapErr
Map value for Err. Do nothing with Ok (use map instead).
Err(new Error("oops"))
.mapErr((cause) => new Error("oh no", { cause }))
.unwrap();andThen
Similar to Promise.then, map and transform an Ok value.
Ok(1)
.andThen((value) => Ok(value + 1))
.unwrap(); // 2This could be used to transform an Ok to an Err.
stack
Return the Err stacktrace (not available for Ok).
const _e = Err(new Error());
console.log(_e.stack);License
MIT