@@ -7,92 +7,97 @@ import { InternetObjectError }            from 'internet-object';
77import  {  InternetObjectSyntaxError  }       from  'internet-object' ; 
88import  {  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