Skip to content

Commit 7fcf6ce

Browse files
committed
refactor: enhance error handling and structure in parseIO function
1 parent edb37e6 commit 7fcf6ce

File tree

1 file changed

+71
-66
lines changed

1 file changed

+71
-66
lines changed

src/pages/playgroud/compiler.ts

Lines changed: 71 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7,92 +7,97 @@ import { InternetObjectError } from 'internet-object';
77
import { InternetObjectSyntaxError } from 'internet-object';
88
import { InternetObjectValidationError } from 'internet-object';
99

10-
type ParsingResult = {
11-
errorMessage? : string,
12-
defs? : Definitions | null,
13-
output? : any | null,
14-
defsMarkers? : any[] | null,
15-
docMarkers? : any[] | null,
16-
}
1710

18-
export default function parseIO(document: string, defs: string | null): ParsingResult {
19-
if (defs === null) {
20-
return parseDoc(document, null)
21-
}
22-
const defsResult = parseDefs(defs)
23-
if (defsResult.errorMessage) {
24-
return defsResult
25-
}
11+
/**
12+
* Marker for editor error highlighting.
13+
*/
14+
export interface ErrorMarker {
15+
message: string;
16+
severity: number;
17+
startLineNumber?: number;
18+
startColumn?: number;
19+
endLineNumber?: number;
20+
endColumn?: number;
21+
}
2622

27-
return parseDoc(document, defsResult.defs)
23+
/**
24+
* Result of parsing an Internet Object document and/or definitions.
25+
*/
26+
export interface ParsingResult {
27+
errorMessage: string | null;
28+
defs: Definitions | null;
29+
output: any | null;
30+
defsMarkers: ErrorMarker[];
31+
docMarkers: ErrorMarker[];
2832
}
2933

30-
function parseDefs(defs: string): ParsingResult {
31-
try {
32-
return {
33-
defs: parseDefinitions(defs, null),
34-
}
35-
} catch (e: any) {
36-
console.log("Error parsing defs")
37-
console.log(e)
38-
return {
39-
errorMessage: getErrorMessage(e),
40-
defsMarkers: getErrorMarkers(e)
41-
}
42-
}
34+
35+
/**
36+
* Parses an Internet Object document and optional definitions.
37+
* Returns a ParsingResult with all fields always present.
38+
*/
39+
40+
export default function parseIO(document: string, defs: string | null): ParsingResult {
41+
if (!defs) return parseDoc(document);
42+
const defsResult = tryParse(defs, parseDefinitions, true);
43+
if (defsResult.errorMessage) return defsResult;
44+
return parseDoc(document, defsResult.defs);
4345
}
4446

45-
function parseDoc(doc: string, defs: Definitions | null = null): ParsingResult {
47+
48+
49+
50+
function tryParse<T>(input: string, fn: (input: string, defs?: any) => T, isDefs = false): ParsingResult {
4651
try {
47-
const d = parse(doc, defs )
52+
const result = fn(input, null);
4853
return {
49-
output: d.toJSON(),
50-
}
54+
errorMessage: null,
55+
defs: isDefs ? result as Definitions : null,
56+
output: isDefs ? null : (result as any).toJSON(),
57+
defsMarkers: [],
58+
docMarkers: [],
59+
};
5160
} catch (e: any) {
52-
console.log("Error parsing document")
53-
console.log(e)
61+
if (process.env.NODE_ENV !== 'production') {
62+
// eslint-disable-next-line no-console
63+
console.error(isDefs ? 'Error parsing defs' : 'Error parsing document', e);
64+
}
5465
return {
5566
errorMessage: getErrorMessage(e),
56-
docMarkers: getErrorMarkers(e)
57-
}
67+
defs: null,
68+
output: null,
69+
defsMarkers: isDefs ? getErrorMarkers(e) : [],
70+
docMarkers: isDefs ? [] : getErrorMarkers(e),
71+
};
5872
}
5973
}
6074

61-
function getErrorMessage(e: any): string {
62-
let errType = "ERROR:"
63-
if (e instanceof InternetObjectSyntaxError) {
64-
errType = "SYNTAX_ERROR: "
65-
} else if (e instanceof InternetObjectValidationError) {
66-
errType = "VALIDATION_ERROR: "
67-
}
6875

69-
return errType + e.message
70-
}
7176

72-
function getErrorMarkers(e:any): any {
73-
if (e instanceof InternetObjectError == false) return []
77+
function parseDoc(doc: string, defs: Definitions | null = null): ParsingResult {
78+
return tryParse(doc, (d) => parse(d, defs));
79+
}
7480

75-
const startPos:any = e.positionRange?.getStartPos()
76-
const endPos:any = e.positionRange?.getEndPos()
7781

78-
if (!startPos && !endPos) {
79-
return []
80-
}
8182

82-
const marker= {
83-
message: e.message,
84-
severity: 8 // monaco.MarkerSeverity.Error
85-
} as any
83+
function getErrorMessage(e: any): string {
84+
if (e instanceof InternetObjectSyntaxError) return 'SYNTAX_ERROR: ' + (e?.message || String(e));
85+
if (e instanceof InternetObjectValidationError) return 'VALIDATION_ERROR: ' + (e?.message || String(e));
86+
return 'ERROR: ' + (e?.message || String(e));
87+
}
8688

87-
if (startPos) {
88-
marker.startLineNumber = startPos.row
89-
marker.startColumn = startPos.col
90-
}
9189

92-
if (endPos) {
93-
marker.endLineNumber = endPos.row
94-
marker.endColumn = endPos.col
95-
}
9690

97-
return [marker]
91+
function getErrorMarkers(e: any): ErrorMarker[] {
92+
if (!(e instanceof InternetObjectError)) return [];
93+
const startPos: any = e.positionRange?.getStartPos();
94+
const endPos: any = e.positionRange?.getEndPos();
95+
if (!startPos && !endPos) return [];
96+
const marker: ErrorMarker = {
97+
message: e.message,
98+
severity: 8, // monaco.MarkerSeverity.Error
99+
...(startPos && { startLineNumber: startPos.row, startColumn: startPos.col }),
100+
...(endPos && { endLineNumber: endPos.row, endColumn: endPos.col })
101+
};
102+
return [marker];
98103
}

0 commit comments

Comments
 (0)