esolang/languages/worker-errors.ts
2022-01-31 18:54:30 +05:30

102 lines
2.6 KiB
TypeScript

import { DocumentRange } from "./types";
/**
* Special error class, to be thrown when encountering a
* syntax error while parsing a program.
*/
export class ParseError extends Error {
/** Location of syntax error in the program */
range: DocumentRange;
/**
* Create an instance of ParseError
* @param message Error message
* @param range Location of syntactically incorrect code
*/
constructor(message: string, range: DocumentRange) {
super(message);
this.name = "ParseError";
this.range = range;
}
}
/**
* Special error class, to be thrown when encountering an error
* at runtime that is indicative of a bug in the user's program.
*/
export class RuntimeError extends Error {
/**
* Create an instance of RuntimeError
* @param message Error message
*/
constructor(message: string) {
super(message);
this.name = "RuntimeError";
}
}
/** Check if an error object is instance of a ParseError */
export const isParseError = (error: any): error is ParseError => {
return error instanceof ParseError || error.name === "ParseError";
};
/** Check if an error object is instance of a RuntimeError */
export const isRuntimeError = (error: any): error is RuntimeError => {
return error instanceof RuntimeError || error.name === "RuntimeError";
};
/**
* Error sent by worker in case of parsing error.
* Not for use by language providers.
*/
export type WorkerParseError = {
name: "ParseError";
message: string;
range: DocumentRange;
};
/**
* Error sent by worker in case error at runtime.
* Not for use by language providers.
*/
export type WorkerRuntimeError = {
name: "RuntimeError";
message: string;
};
/**
* Error sent by worker indicating an implementation bug.
* Not for use by language providers.
*/
export type WorkerError = {
name: string;
message: string;
stack?: string;
};
/**
* Serialize a RuntimeError instance into a plain object.
* Not for use by language providers.
*/
export const serializeRuntimeError = (
error: RuntimeError
): WorkerRuntimeError => {
return { name: "RuntimeError", message: error.message };
};
/**
* Serialize a ParseError instance into a plain object.
* Not for use by language providers.
*/
export const serializeParseError = (error: ParseError): WorkerParseError => {
return { name: "ParseError", message: error.message, range: error.range };
};
/**
* Serialize an arbitrary error into a plain object.
* Not for use by language providers.
*/
export const serializeError = (error: Error): WorkerError => {
return { name: error.name, message: error.message, stack: error.stack };
};