59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
#include "jsoncdaccord.h"
|
|
#include "internal.h"
|
|
#include "optional.h"
|
|
|
|
int _jdac_check_additionalproperties(json_object *jobj, json_object *jschema) {
|
|
json_object *jaddprops = json_object_object_get(jschema, "additionalProperties");
|
|
|
|
if (!jaddprops) {
|
|
return JDAC_ERR_VALID;
|
|
}
|
|
|
|
if (!json_object_is_type(jaddprops, json_type_object) && !json_object_is_type(jaddprops, json_type_boolean)) {
|
|
return JDAC_ERR_SCHEMA_ERROR;
|
|
}
|
|
|
|
json_object *jprops = json_object_object_get(jschema, "properties");
|
|
#ifdef JDAC_PATTERNPROPERTIES
|
|
json_object *jpatprops = json_object_object_get(jschema, "patternProperties");
|
|
#endif
|
|
|
|
json_object_object_foreach(jobj, jobj_key, jobj_val) {
|
|
|
|
// if an instance key is found in properties, it is not an additional property
|
|
if (jprops) {
|
|
json_object *jprop = json_object_object_get(jprops, jobj_key);
|
|
if (jprop) {
|
|
continue; // ignore properties
|
|
}
|
|
}
|
|
|
|
// if an instance key has a match in patternProperties, it is not an additional property
|
|
#ifdef JDAC_PATTERNPROPERTIES
|
|
int foundpatternproperty = 0;
|
|
if (jpatprops) {
|
|
if (json_object_is_type(jpatprops, json_type_object)) {
|
|
json_object_object_foreach(jpatprops, jpat_key, jpat_val) {
|
|
int ret = _jdac_match_string_with_regex(jpat_key, jobj_key);
|
|
if (ret == JDAC_REGEX_MATCH) {
|
|
foundpatternproperty = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (foundpatternproperty) {
|
|
continue;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// by this point we consider the instance to be an additional property
|
|
int err = _jdac_validate_instance(jobj_val, jaddprops);
|
|
if (err) {
|
|
return err;
|
|
}
|
|
}
|
|
|
|
return JDAC_ERR_VALID;
|
|
}
|