Skip to content

Commit 6d31961

Browse files
committed
Fill meaningful message to parse error.
1 parent 155bf19 commit 6d31961

File tree

5 files changed

+21
-5
lines changed

5 files changed

+21
-5
lines changed

binding/exported-functions.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ _xmlXPathFreeObject
1212
_xmlDocGetRootElement
1313
_xmlHasProp
1414
_xmlNodeGetContent
15+
_xmlGetLastError

src/index.mts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import XmlDocument from './document.mjs';
2-
import { XmlParseError, xmlReadMemory } from './libxml2.mjs';
2+
import {
3+
XmlErrorStruct,
4+
xmlGetLastError,
5+
XmlParseError,
6+
xmlReadMemory,
7+
} from './libxml2.mjs';
38

49
export {
510
XmlNode,
@@ -17,8 +22,8 @@ export interface ParserOptions {
1722
export function parseXmlString(source: string /* , options?: ParserOptions */): XmlDocument {
1823
const docPtr = xmlReadMemory(source);
1924
if (!docPtr) {
20-
// TODO: get error information from libxml2
21-
throw new XmlParseError();
25+
const err = xmlGetLastError();
26+
throw new XmlParseError(XmlErrorStruct.message(err));
2227
}
2328
return new XmlDocument(docPtr);
2429
}

src/libxml2.mts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,14 @@ export module XmlNodeStruct {
134134
export class XmlAttrStruct extends XmlTreeCommonStruct {
135135
}
136136

137+
export class XmlErrorStruct {
138+
static message = getStringValueFunc(8);
139+
}
140+
137141
export const xmlNewDoc = libxml2._xmlNewDoc;
138142
export const xmlXPathNewContext = libxml2._xmlXPathNewContext;
139143
export const xmlXPathFreeContext = libxml2._xmlXPathFreeContext;
140144
export const xmlXPathFreeObject = libxml2._xmlXPathFreeObject;
141145
export const xmlDocGetRootElement = libxml2._xmlDocGetRootElement;
146+
147+
export const xmlGetLastError = libxml2._xmlGetLastError;

src/libxml2raw.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ type XmlNodePtr = Pointer;
55
type XmlAttrPtr = Pointer;
66
type XmlXPathContextPtr = Pointer;
77
type XmlXPathObjectPtr = Pointer;
8-
8+
type XmlErrorPtr = Pointer;
99
export class LibXml2 {
1010
HEAP32: Int32Array;
1111
getValue(ptr: Pointer, type: string): number;
@@ -34,6 +34,7 @@ export class LibXml2 {
3434
_xmlDocGetRootElement(doc: XmlDocPtr): XmlNodePtr;
3535
_xmlHasProp(node: XmlNodePtr, name: CString): XmlAttrPtr;
3636
_xmlNodeGetContent(node: XmlNodePtr): CString;
37+
_xmlGetLastError(): XmlErrorPtr;
3738
}
3839

3940
export default function moduleLoader(): Promise<LibXml2>;

test/parseXml.spec.mts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ describe('parseXmlString', () => {
1212
});
1313

1414
it('should throw exception on invalid xml string', () => {
15-
expect(() => parseXmlString('<doc>')).to.throw(XmlParseError);
15+
expect(() => parseXmlString('<doc>')).to.throw(
16+
XmlParseError,
17+
'Premature end of data in tag doc line 1\n',
18+
);
1619
});
1720
});

0 commit comments

Comments
 (0)