1 #include <stdio.h>
2 #include <string.h>
3 #include <json-c/json.h>
4 #include "validate.h"
5
_schemavalidator_output_create_node(const char * name)6 json_object *_schemavalidator_output_create_node(const char *name)
7 {
8 json_object *joutput = json_object_new_object();
9 json_object_object_add(joutput, "name", json_object_new_string(name));
10 json_object_object_add(joutput, "nodes", json_object_new_array());
11 return joutput;
12 }
13
_schemavalidator_output_append_node(json_object * joutput,json_object * jnode)14 void _schemavalidator_output_append_node(json_object *joutput,
15 json_object *jnode)
16 {
17 json_object *jarray;
18 if (json_object_object_get_ex(joutput, "nodes", &jarray)) {
19 json_object_array_add(jarray, jnode);
20 }
21 }
22
23 json_object *
_schemavalidator_output_create_and_append_node(json_object * joutput,const char * name)24 _schemavalidator_output_create_and_append_node(json_object *joutput,
25 const char *name)
26 {
27 json_object *jarray;
28 if (json_object_object_get_ex(joutput, "nodes", &jarray)) {
29 json_object *jnode_new =
30 _schemavalidator_output_create_node(name);
31 json_object_array_add(jarray, jnode_new);
32 return jnode_new;
33 }
34 return NULL;
35 }
36
_schemavalidator_output_create_and_append_node_concatnames(json_object * joutput,char * name1,char * name2)37 json_object *_schemavalidator_output_create_and_append_node_concatnames(
38 json_object *joutput, char *name1, char *name2)
39 {
40 char newname[256];
41 snprintf(newname, sizeof(newname), "%s/%s", name1, name2);
42 return _schemavalidator_output_create_and_append_node(joutput, newname);
43 }
44
_schemavalidator_output_apply_result(json_object * joutput,enum schemavalidator_errors err)45 void _schemavalidator_output_apply_result(json_object *joutput,
46 enum schemavalidator_errors err)
47 {
48 int res = err == SCHEMAVALIDATOR_ERR_VALID ? 1 : 0;
49 json_object_object_add(joutput, "valid", json_object_new_boolean(res));
50 }
51
schemavalidator_output_print_traverse_error_nodes(json_object * jnode,const char * parentpathstr)52 void schemavalidator_output_print_traverse_error_nodes(
53 json_object *jnode, const char *parentpathstr)
54 {
55 char path[256];
56 if (jnode == NULL) {
57 return;
58 }
59
60 json_object *jobj;
61 if (json_object_object_get_ex(jnode, "valid", &jobj)) {
62 int valid = json_object_get_boolean(jobj);
63 if (valid) {
64 return;
65 }
66 }
67
68 json_object *jarray;
69 if (json_object_object_get_ex(jnode, "nodes", &jarray)) {
70 int arraylen = json_object_array_length(jarray);
71 if (arraylen == 0) {
72 printf("ERROR: %s\n", parentpathstr);
73 }
74 for (int i = 0; i < arraylen; i++) {
75 json_object *jnode =
76 json_object_array_get_idx(jarray, i);
77 json_object *jname;
78 if (json_object_object_get_ex(jnode, "name", &jname)) {
79 snprintf(path, 256, "%s/%s", parentpathstr,
80 json_object_get_string(jname));
81 schemavalidator_output_print_traverse_error_nodes(
82 jnode, path);
83 }
84 }
85 }
86 }
87
_schemavalidator_output_print_errors(json_object * joutput)88 void _schemavalidator_output_print_errors(json_object *joutput)
89 {
90 if (!joutput) {
91 return;
92 }
93
94 json_object *rootnode = joutput;
95 ;
96 json_object *jobj;
97 if (json_object_object_get_ex(rootnode, "valid", &jobj)) {
98 int valid = json_object_get_boolean(jobj);
99 if (valid) {
100 //printf("Validation OK\n");
101 } else {
102 json_object *jarray;
103 if (json_object_object_get_ex(rootnode, "nodes",
104 &jarray)) {
105 int arraylen = json_object_array_length(jarray);
106 for (int i = 0; i < arraylen; i++) {
107 json_object *jnode =
108 json_object_array_get_idx(
109 jarray, i);
110 schemavalidator_output_print_traverse_error_nodes(
111 jnode, "#");
112 }
113 }
114 }
115 }
116 }
117