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