@taml/parser
Version:
Parser for TAML (Terminal ANSI Markup Language) that generates AST nodes
130 lines (128 loc) • 9.33 kB
JavaScript
/**
* Error types for TAML parser
*/
/**
* Base class for all TAML parsing errors
*/
export class TamlParseError extends Error {
position;
line;
column;
source;
constructor(message, position, line, column, source) {
super(message);
this.position = position;
this.line = line;
this.column = column;
this.source = source;
this.name = "TamlParseError";
}
/**
* Create a detailed error message with context
*/
getDetailedMessage() {
if (!this.source) {
return this.message;
}
const lines = this.source.split("\n");
const errorLine = lines[this.line - 1];
const pointer = `${" ".repeat(Math.max(0, this.column - 1))}^`;
return `${this.message}
${this.line} | ${errorLine || ""}
${" ".repeat(String(this.line).length)} | ${pointer}
Position: line ${this.line}, column ${this.column}`;
}
}
/**
* Error thrown when an invalid tag name is encountered
*/
export class InvalidTagError extends TamlParseError {
tagName;
constructor(tagName, position, line, column, source) {
super(`Invalid tag name '${tagName}' at line ${line}, column ${column}. Tag names must be one of the 37 valid TAML tags.`, position, line, column, source);
this.tagName = tagName;
this.name = "InvalidTagError";
}
}
/**
* Error thrown when a tag is not properly closed
*/
export class UnclosedTagError extends TamlParseError {
tagName;
constructor(tagName, position, line, column, source) {
super(`Unclosed tag '${tagName}' at line ${line}, column ${column}. Expected '</${tagName}>' before end of input.`, position, line, column, source);
this.tagName = tagName;
this.name = "UnclosedTagError";
}
}
/**
* Error thrown when closing tag doesn't match opening tag
*/
export class MismatchedTagError extends TamlParseError {
expected;
actual;
constructor(expected, actual, position, line, column, source) {
super(`Mismatched closing tag at line ${line}, column ${column}. Expected '</${expected}>' but found '</${actual}>'.`, position, line, column, source);
this.expected = expected;
this.actual = actual;
this.name = "MismatchedTagError";
}
}
/**
* Error thrown when a tag is malformed (e.g., missing brackets, spaces in tag name)
*/
export class MalformedTagError extends TamlParseError {
content;
constructor(content, position, line, column, source) {
super(`Malformed tag '${content}' at line ${line}, column ${column}. Tags must follow the pattern '<tagName>' or '</tagName>'.`, position, line, column, source);
this.content = content;
this.name = "MalformedTagError";
}
}
/**
* Error thrown when an unexpected end of input is encountered
*/
export class UnexpectedEndOfInputError extends TamlParseError {
constructor(position, line, column, source, context) {
const contextMsg = context ? ` while ${context}` : "";
super(`Unexpected end of input at line ${line}, column ${column}${contextMsg}.`, position, line, column, source);
this.name = "UnexpectedEndOfInputError";
}
}
/**
* Error thrown when an unexpected character is encountered
*/
export class UnexpectedCharacterError extends TamlParseError {
character;
constructor(character, position, line, column, source, expected) {
const expectedMsg = expected ? ` Expected ${expected}.` : "";
super(`Unexpected character '${character}' at line ${line}, column ${column}.${expectedMsg}`, position, line, column, source);
this.character = character;
this.name = "UnexpectedCharacterError";
}
}
/**
* Helper function to create position information
*/
export function calculatePosition(source, index) {
let line = 1;
let column = 1;
for (let i = 0; i < index && i < source.length; i++) {
if (source[i] === "\n") {
line++;
column = 1;
}
else {
column++;
}
}
return { line, column };
}
/**
* Helper function to create error with position calculated from source
*/
export function createErrorAtPosition(ErrorClass, source, position, ...additionalArgs) {
const { line, column } = calculatePosition(source, position);
return new ErrorClass(...additionalArgs, position, line, column, source);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFHckI7SUFDQTtJQUNBO0lBQ0E7SUFMbEIsWUFDRSxPQUFlLEVBQ0MsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLE1BQWMsRUFDZCxNQUFlO1FBRS9CLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUxDLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBRy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFFL0QsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPOztFQUV4QixJQUFJLENBQUMsSUFBSSxNQUFNLFNBQVMsSUFBSSxFQUFFO0VBQzlCLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMs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