Skip to content

Commit f6908b5

Browse files
allevomcollina
authored andcommitted
Nested if then else (#98)
* Nested if then else * Implement if then else in if too * Delete from copy
1 parent dbb1e07 commit f6908b5

File tree

3 files changed

+227
-60
lines changed

3 files changed

+227
-60
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,6 @@ Example:
295295
const stringify = fastJson({
296296
'type': 'object',
297297
'properties': {
298-
'kind': { 'type': 'string', 'enum': ['foobar', 'greeting'] }
299298
},
300299
'if': {
301300
'properties': {
@@ -304,12 +303,14 @@ const stringify = fastJson({
304303
},
305304
'then': {
306305
'properties': {
306+
'kind': { 'type': 'string', 'enum': ['foobar'] },
307307
'foo': { 'type': 'string' },
308308
'bar': { 'type': 'number' }
309309
}
310310
},
311311
'else': {
312312
'properties': {
313+
'kind': { 'type': 'string', 'enum': ['greeting'] },
313314
'hi': { 'type': 'string' },
314315
'hello': { 'type': 'number' }
315316
}
@@ -332,6 +333,8 @@ console.log(stringify({
332333
})) // {"kind":"greeting","foo":"FOO","bar":42}
333334
```
334335
336+
**NB:** don't declare the properties twice or you'll print them twice!
337+
335338
<a name="ref"></a>
336339
#### Reuse - $ref
337340
If you want to reuse a definition of a value, you can use the property `$ref`.

index.js

Lines changed: 60 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ function build (schema, options) {
5151
`
5252
}
5353

54+
var hasShemaSomeIf = hasIf(schema)
55+
5456
var main
5557

5658
switch (schema.type) {
@@ -92,7 +94,7 @@ function build (schema, options) {
9294

9395
var dependencies = []
9496
var dependenciesName = []
95-
if (hasAnyOf(schema) || hasArrayOfTypes(schema) || hasIf(schema)) {
97+
if (hasAnyOf(schema) || hasArrayOfTypes(schema) || hasShemaSomeIf) {
9698
dependencies.push(new Ajv())
9799
dependenciesName.push('ajv')
98100
}
@@ -512,57 +514,83 @@ function buildInnerObject (schema, name, externalSchema, fullSchema) {
512514
return { code: code, laterCode: laterCode }
513515
}
514516

515-
function buildObject (schema, code, name, externalSchema, fullSchema) {
517+
function addIfThenElse (schema, name, externalSchema, fullSchema) {
518+
var code = ''
519+
var r
520+
var laterCode = ''
521+
var innerR
522+
523+
const copy = merge({}, schema)
524+
const i = copy.if
525+
const then = copy.then
526+
const e = copy.else
527+
delete copy.if
528+
delete copy.then
529+
delete copy.else
530+
var merged = merge(copy, then)
531+
516532
code += `
517-
function ${name} (obj) {
518-
var json = '{'
519-
var addComma = false
533+
valid = ajv.validate(${require('util').inspect(i, {depth: null})}, obj)
534+
if (valid) {
520535
`
536+
if (merged.if && merged.then) {
537+
innerR = addIfThenElse(merged, name, externalSchema, fullSchema)
538+
code += innerR.code
539+
laterCode = innerR.laterCode
540+
}
521541

522-
var laterCode = ''
523-
var r, merged
524-
if (schema.if && schema.then) {
525-
merged = merge(schema, schema.then)
526-
delete merged.if
527-
delete merged.then
528-
delete merged.else
542+
r = buildInnerObject(merged, name, externalSchema, fullSchema)
543+
code += r.code
544+
laterCode = r.laterCode
545+
546+
code += `
547+
}
548+
`
549+
if (e) {
550+
merged = merge(copy, e)
529551

530552
code += `
531-
var valid = ajv.validate(${require('util').inspect(schema.if, {depth: null})}, obj)
532-
if (valid) {
553+
else {
533554
`
534555

556+
if (merged.if && merged.then) {
557+
innerR = addIfThenElse(merged, name, externalSchema, fullSchema)
558+
code += innerR.code
559+
laterCode = innerR.laterCode
560+
}
561+
535562
r = buildInnerObject(merged, name, externalSchema, fullSchema)
536563
code += r.code
537564
laterCode = r.laterCode
538565

539566
code += `
540567
}
541568
`
542-
if (schema.else) {
543-
merged = merge(schema, schema.else)
544-
delete merged.if
545-
delete merged.then
546-
delete merged.else
547-
548-
code += `
549-
else {
550-
`
569+
}
570+
return { code: code, laterCode: laterCode }
571+
}
551572

552-
r = buildInnerObject(merged, name, externalSchema, fullSchema)
553-
code += r.code
554-
laterCode = r.laterCode
573+
function buildObject (schema, code, name, externalSchema, fullSchema) {
574+
code += `
575+
function ${name} (obj) {
576+
var json = '{'
577+
var addComma = false
578+
`
555579

556-
code += `
557-
}
558-
`
559-
}
580+
var laterCode = ''
581+
var r
582+
if (schema.if && schema.then) {
583+
code += `
584+
var valid
585+
`
586+
r = addIfThenElse(schema, name, externalSchema, fullSchema)
560587
} else {
561588
r = buildInnerObject(schema, name, externalSchema, fullSchema)
562-
code += r.code
563-
laterCode = r.laterCode
564589
}
565590

591+
code += r.code
592+
laterCode = r.laterCode
593+
566594
// Removes the comma if is the last element of the string (in case there are not properties)
567595
code += `
568596
json += '}'

0 commit comments

Comments
 (0)