I'm trying to create a schema that has a slightly different structure depending upon values and decided to use draft 07 and ajv to validate it. The structure I'm trying to create is as follows -
"url":{
"some-random-string":{
"pattern":"somevalue",
"handler":"one-of-a-few-allowed-values",
"kwargs":{ "conditional object" with further constraints}
}
}
of this, pattern is required, and certain kwargs objects will have other required keys. I tried using a series of if..then statements combined with a reference as follows :
"url": {
"type": "object",
"patternProperties": {
"^.*$": {
"properties": {
"pattern": {
"type": "string"
},
"handler": {
"type": "string",
"enum": ["val1","val2"...
]
}
},
"required": ["pattern"],
"if": {
"properties": {
"handler": {
"enum": ["val1"]
}
}
},
"then": {
"properties": {
"kwargs": {
"$ref": "#/definitions/val1"
}
}
},
"if": {
"properties": {
"handler": {
"enum": ["val2"]
}
}
},
"then": {
"properties": {
"kwargs": {
"$ref": "#/definitions/val2"
},"required":["function"]
}
},
the required pattern constraint works, the required function constraint does not.
I even tried wrapping up all of the if-then statements into an allOf array, with each set of if-then inside one object, but it doesn't seem to work.
the reference currently looks like this
"val2": {
"type": ["object", "boolean"],
"properties": {
"kwargs": {
"type": "object",
"properties": {
"function": {
"type": "string"
},
"methods": {
"type": "array",
"items": {
"enum": ["GET", "PUT", "POST", "DELETE", "OPTIONS"]
}
}
}
}
}
}