@casual-simulation/aux-common
Version:
Common library for AUX projects
149 lines • 4.16 kB
JavaScript
export function logErrors(multiError, prefix) {
logError(multiError, prefix);
for (let error of multiError.errors) {
logError(error, ' ' + prefix);
}
}
export function logError(error, prefix, log = console.error) {
log(`${prefix !== null && prefix !== void 0 ? prefix : ''} Error: ${error.errorMessage} (${error.errorCode})`);
if (error.reason) {
log(` ${prefix !== null && prefix !== void 0 ? prefix : ''} Reason:`, error.reason);
}
if (error.issues) {
log(` ${prefix !== null && prefix !== void 0 ? prefix : ''} Issues:`, error.issues);
}
if (error.errors && Array.isArray(error.errors)) {
for (let i = 0; i < error.errors.length; i++) {
const err = error.errors[i];
logError(err, ` ${prefix !== null && prefix !== void 0 ? prefix : ''} ${i + 1}:`, log);
}
}
}
export function genericResult(result) {
var _a;
if (isSuccess(result)) {
if (typeof result.value === 'object') {
return {
success: true,
...((_a = result.value) !== null && _a !== void 0 ? _a : {}),
};
}
else {
return { success: true, value: result.value };
}
}
else {
return {
success: false,
...result.error,
};
}
}
export function mapResult(result, fn) {
return isSuccess(result)
? success(fn(result.value))
: result;
}
export function flatMapResult(result, fn) {
return isSuccess(result) ? fn(result.value) : result;
}
export function matchResult(result, cases) {
if (isSuccess(result)) {
return cases.success(result.value);
}
else {
const error = result.error;
const handler = cases[error.errorCode];
if (handler) {
return handler(error);
}
else {
throw new Error(`No handler for error code: ${error.errorCode}`);
}
}
}
export function success(value) {
return R.success(value);
}
export function failure(error) {
return R.failure(error);
}
export function isSuccess(result) {
return result.success === true;
}
export function isFailure(result) {
return result.success === false;
}
export function unwrap(result) {
if (isSuccess(result)) {
return result.value;
}
else {
throw new Error(`Result is a failure: ${JSON.stringify(result.error)}`);
}
}
export function logResult(result, message) {
if (isSuccess(result)) {
console.log(message !== null && message !== void 0 ? message : 'Result:', result.value);
}
else {
console.error(message !== null && message !== void 0 ? message : 'Error:', result.error);
}
return result;
}
export function wrap(fn) {
try {
const result = fn();
if (result instanceof Promise) {
return result
.then((value) => success(value))
.catch((error) => failure({
errorCode: 'wrapped_error',
errorMessage: error.message,
error,
}));
}
else {
return success(result);
}
}
catch (error) {
return failure({
errorCode: 'wrapped_error',
errorMessage: error.message,
error,
});
}
}
export class R {
constructor(success, _data) {
this.success = success;
this._data = _data;
if (!success && typeof _data === 'object' && 'success' in _data) {
const { success: _, ...error } = _data;
this._data = error;
}
}
static success(value) {
return new R(true, value);
}
static failure(error) {
return new R(false, error);
}
get value() {
return this._data;
}
get error() {
return this._data;
}
toString() {
return `Result(${this.success}, ${JSON.stringify(this._data)})`;
}
toJSON() {
return genericResult(this);
}
[Symbol.for('nodejs.util.inspect.custom')]() {
return this.toJSON();
}
}
//# sourceMappingURL=Result.js.map