forked from ceejbot/recurring
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.js
108 lines (96 loc) · 2.37 KB
/
parser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
'use strict'
const xml2js = require('xml2js')
function parseTypes(input) {
let result = { }
let item,
key
const keys = Object.keys(input)
let mode = 'normal'
try {
for (let i = 0; i < keys.length; i++) {
key = keys[i]
item = input[key]
if (mode === 'array') {
mode = 'normal'
if (Array.isArray(item)) {
result = [ ]
for (let j = 0; j < item.length; j++) {
if (typeof item[j] === 'string') {
result.push(item[j])
}
else {
result.push(parseTypes(item[j]))
}
}
}
else if (typeof item === 'string') {
result = [ item ]
}
else {
result = [ parseTypes(item) ]
}
}
else if (typeof item === 'object') {
if (item['#'] && item.type && (item.type === 'datetime')) {
result[key] = new Date(item['#'])
}
else if (item['#'] && item.type && (item.type === 'integer')) {
result[key] = parseInt(item['#'], 10)
}
else if (item['#'] && item.type && (item.type === 'boolean')) {
result[key] = Boolean(item['#'] === 'true')
}
else if (item.nil && (item.nil === 'nil')) {
result[key] = ''
}
else {
result[key] = parseTypes(item)
}
}
else if ((key === 'type') && (item === 'array')) {
mode = 'array'
}
else {
result[key] = item
}
}
}
catch (exception) {
// console.error('recurly.parseTypes: @ ' + key + ' ' + item + ' ' + JSON.stringify(exception));
result = input
}
return result
}
class RecurlyParser {
constructor() {
this.parser = new xml2js.Parser(
{
mergeAttrs: true,
attrkey: '#',
charkey: '#',
explicitArray: false,
explicitRoot: false
})
}
parseXML(input, callback) {
let calledBack = false
this.parser.removeAllListeners('error')
this.parser.on('error', exception => {
calledBack = true
callback(exception)
})
this.parser.parseString(input, (err, json) => {
if (calledBack) {
return
}
if (err) {
return callback(err)
}
callback(null, parseTypes(json))
})
}
}
function createParser() {
return new RecurlyParser()
}
exports.createParser = createParser