Skip to content

Commit 2cff1fc

Browse files
committed
Support array types.
1 parent 9acec40 commit 2cff1fc

File tree

2 files changed

+161
-29
lines changed

2 files changed

+161
-29
lines changed

index.js

Lines changed: 87 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ function build (schema) {
2626
case 'null':
2727
main = $asNull.name
2828
break
29+
case 'array':
30+
main = '$main'
31+
code = buildArray(schema, code, main)
32+
break
2933
default:
3034
throw new Error(`${schema.type} unsupported`)
3135
}
@@ -35,6 +39,8 @@ function build (schema) {
3539
return ${main}
3640
`
3741

42+
// console.log(code)
43+
3844
return (new Function(code))()
3945
}
4046

@@ -79,39 +85,14 @@ function buildObject (schema, code, name) {
7985
var laterCode = ''
8086

8187
Object.keys(schema.properties).forEach((key, i, a) => {
82-
const type = schema.properties[key].type
83-
8488
code += `
8589
json += '${$asString(key)}:'
8690
`
8791

88-
switch (type) {
89-
case 'null':
90-
code += `
91-
json += $asNull()
92-
`
93-
break
94-
case 'string':
95-
code += `
96-
json += $asString(obj.${key})
97-
`
98-
break
99-
case 'number':
100-
case 'integer':
101-
code += `
102-
json += $asNumber(obj.${key})
103-
`
104-
break
105-
case 'object':
106-
let funcName = name + key
107-
laterCode = buildObject(schema.properties[key], laterCode, funcName)
108-
code += `
109-
json += ${funcName}(obj.${key})
110-
`
111-
break
112-
default:
113-
throw new Error(`${type} unsupported`)
114-
}
92+
const result = nested(laterCode, name, '.' + key, schema.properties[key])
93+
94+
code += result.code
95+
laterCode = result.laterCode
11596

11697
if (i < a.length - 1) {
11798
code += 'json += \',\''
@@ -129,4 +110,81 @@ function buildObject (schema, code, name) {
129110
return code
130111
}
131112

113+
function buildArray (schema, code, name) {
114+
code += `
115+
function ${name} (obj) {
116+
var json = '['
117+
`
118+
119+
var laterCode = ''
120+
121+
const result = nested(laterCode, name, '[i]', schema.items)
122+
123+
code += `
124+
for (var i = 0; i < obj.length; i++) {
125+
${result.code}
126+
if (i < obj.length - 1) {
127+
json += ','
128+
}
129+
}
130+
`
131+
132+
laterCode = result.laterCode
133+
134+
code += `
135+
json += ']'
136+
return json
137+
}
138+
`
139+
140+
code += laterCode
141+
142+
return code
143+
}
144+
145+
function nested (laterCode, name, key, schema) {
146+
var code = ''
147+
var funcName
148+
const type = schema.type
149+
switch (type) {
150+
case 'null':
151+
code += `
152+
json += $asNull()
153+
`
154+
break
155+
case 'string':
156+
code += `
157+
json += $asString(obj${key})
158+
`
159+
break
160+
case 'number':
161+
case 'integer':
162+
code += `
163+
json += $asNumber(obj${key})
164+
`
165+
break
166+
case 'object':
167+
funcName = (name + key).replace(/[-.\[\]]/g, '')
168+
laterCode = buildObject(schema, laterCode, funcName)
169+
code += `
170+
json += ${funcName}(obj${key})
171+
`
172+
break
173+
case 'array':
174+
funcName = (name + key).replace(/[-.\[\]]/g, '')
175+
laterCode = buildArray(schema, laterCode, funcName)
176+
code += `
177+
json += ${funcName}(obj${key})
178+
`
179+
break
180+
default:
181+
throw new Error(`${type} unsupported`)
182+
}
183+
184+
return {
185+
code,
186+
laterCode
187+
}
188+
}
189+
132190
module.exports = build

test.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,77 @@ buildTest({
104104
}, {
105105
firstName: null
106106
})
107+
108+
buildTest({
109+
'title': 'array with objects',
110+
'type': 'array',
111+
'items': {
112+
'type': 'object',
113+
'properties': {
114+
'name': {
115+
'type': 'string'
116+
}
117+
}
118+
}
119+
}, [{
120+
name: 'Matteo'
121+
}, {
122+
name: 'Dave'
123+
}])
124+
125+
buildTest({
126+
'title': 'array with strings',
127+
'type': 'array',
128+
'items': {
129+
'type': 'string'
130+
}
131+
}, [
132+
'Matteo',
133+
'Dave'
134+
])
135+
136+
buildTest({
137+
'title': 'array with numbers',
138+
'type': 'array',
139+
'items': {
140+
'type': 'number'
141+
}
142+
}, [
143+
42.42,
144+
24
145+
])
146+
147+
buildTest({
148+
'title': 'array with integers',
149+
'type': 'array',
150+
'items': {
151+
'type': 'number'
152+
}
153+
}, [
154+
42,
155+
24
156+
])
157+
158+
buildTest({
159+
'title': 'nested array with objects',
160+
'type': 'object',
161+
'properties': {
162+
'data': {
163+
'type': 'array',
164+
'items': {
165+
'type': 'object',
166+
'properties': {
167+
'name': {
168+
'type': 'string'
169+
}
170+
}
171+
}
172+
}
173+
}
174+
}, {
175+
data: [{
176+
name: 'Matteo'
177+
}, {
178+
name: 'Dave'
179+
}]
180+
})

0 commit comments

Comments
 (0)