0.0.4 • Published 2 years ago
rustly v0.0.4
Introduction
rustly is a TypeScript library that brings the power of Rust's Option and Result types to the TypeScript ecosystem. This package provides robust error handling and nullable value representation, allowing you to write more reliable and expressive code. The Option type deals with nullable values, while the Result type handles potential errors.
Features
- Rust-like
OptionandResulttypes for TypeScript - Safe and expressive error handling
- Familiar Rust-inspired API
- Easily manage nullable values and errors in a type-safe manner
Installation
You can install rustly using npm:
npm install --save rustlyUsage
Result Usage
import { Ok, Err, Result } from 'rustly';
const success = Ok(1);
const failure = Err('not a number');
success.ok(); // Option(1)
success.isOk(); // true
success.isOkAnd(val => val === 1); // true
success.err(); // None
success.isErr(); // false
success.isErrAnd(val => val === 1); // false
success.unwrap(); // 1
success.unwrapOr('not a number'); // 1
success.unwrapErr(); // throws
success.unwrapErrOr(42); // 42
success.expect('not a number'); // 1
success.expectErr('not a number'); // throws
const successPlusOneOrZeroIfErr = success.match({
ok(val) {
// If it is Ok return the value + 1
return val + 1;
},
err() {
// Return 0 if there was an error
return 0;
}
})
success.map(val => val + 1); // Ok(2)
success.mapErr(val => val + 1); // Ok(1)
success.and(Ok(2)); // Ok(2)
success.and(Err('not a number')); // Err('not a number')
// Merge array of Result into a single Result
const arrayOfResult = [Ok(1), Ok(2), Ok(3)], Err('not a number')];
Result.merge(arrayOfResult); // Ok([1, 2, 3])
Result.mergeErr(arrayOfResult); // Err(['not a number'])
// Nested Result
const nestedResult = Ok(Ok(1));
nestedResult.flatten(); // Ok(1)
success.map(val => Err()).flatten(); // Err()Option usage
import { Some, None, Option } from 'rustly';
const some = Some(1);
const none = None();
some.isSome(); // true
some.isSomeAnd(val => val === 1); // true
some.isNone(); // false
some.isNoneAnd(val => val === 1); // false
some.unwrap(); // 1
some.unwrapOr('not a number'); // 1
some.expect('not a number'); // 1
const somePlusOneOrZeroIfNone = some.match({
some(val) {
// If it is Some return the value + 1
return val + 1;
},
none() {
// Return 0 if it is None
return 0;
}
})
none.insert(5); // Some(5)
const taken = some.take(); // Some(1) and some is now None
some.replace(2); // Some(2)
some.map(val => val + 1); // Some(2)
some.mapOr(42, val => val + 1); // Some(2)
none.mapOr(42, val => val + 1); // 42
some.okOr('not a number'); // Ok(1)
none.okOr('not a number'); // Err('not a number')
some.or(Some(2)); // Some(1)
none.or(Some(2)); // Some(2)
some.and(Some(2)); // Some(2)
none.and(Some(2)); // NonePromise override
Promise.resolveFromOk(1)
.thenOnOk(okvalue => console.log(okvalue))
.thenOnErr(errvalue => console.log(errvalue));
Promise.resolveFromErr(1)
.thenOnOk(okvalue => console.log(okvalue))
.thenOnErr(errvalue => console.log(errvalue)); Contributing
Contributions are welcome! If you find any issues or have new features to add, please feel free to open an issue or submit a pull request.
License
This project is licensed under the MIT License. See the LICENSE file for details.