For my latest app I wanted to be able to code the front-end first, without having to do super extensive documentation and without forgetting my data types later on while coding the back-end. I thus tried to make some kind of JSON Validator that expects something and outputs true or false depending on the input fed to it. (Meaning that I can define my data structures that way)
What I have works, but I'm not sure if that was the right way to go. Any comments?
export class ArrayValidator {
/**
* Array-Template Syntax:
* {
* "layer_type": "object"|"array"|"value",
(if array):
"items": -1,
"item": {"layer_type": ...}
(end if array)
(if value)
"value": 'regexp'
(end if value)
(if object)
"properties": [
{
"name": "string",
"null_allowed": true|false,
"value": {"layer_type": etc ...}
},
{...}
]
(end if object)
* }
**/
public static testUpon(arrayToTest, arrayTemplate) : boolean {
if(arrayTemplate.layer_type == "object"){
for(let prop of arrayTemplate.properties){
if(arrayToTest[prop.name] == null && prop.nullAllowed == 'false'){
console.log("[ArrayValidator][Error]Nonexistent property: " + prop.name);
return false;
}
if(arrayToTest[prop.name] != null && !ArrayValidator.testUpon(arrayToTest[prop.name], prop.value)) return false;
}
}else if(arrayTemplate.layer_type == "array"){
if(arrayTemplate.items!=-1 && arrayToTest.length != arrayTemplate.items){
console.log("[ArrayValidator][Error]Array of wrong length.");
return false;
}
for(let item of arrayToTest){
if(!ArrayValidator.testUpon(item, arrayTemplate.item)) return false;
}
}else if(arrayTemplate.layer_type == "value"){
let regexp = new RegExp(arrayTemplate.value);
let res = regexp.test(arrayToTest);
if(!res) console.log("[ArrayValidator][Error]Value Regexp doesn't match. [Regexp: " + arrayTemplate.value + ", Value: " + arrayToTest + "]");
return res;
}
return true;
}
public static test(){
let template = JSON.parse('{"layer_type": "object", "properties": [{"name": "obj", "nullAllowed": "false", "value": {"layer_type": "object", "properties": []}}, {"name": "embed", "nullAllowed": "false", "value": {"layer_type": "array", "items": -1, "item":{"layer_type": "value", "value": "(.+?)"}}}, {"name": "testVal", "nullAllowed": "false", "value": {"layer_type": "value", "value": "^[A-Za-z]+$"}}]}');
let test = JSON.parse('{"testVal": "Hello", "embed": ["test", "another test", 24], "obj": {}}');
console.log("Output: " + ArrayValidator.testUpon(test, template));
}
}