xref: /openbmc/libcper/tests/schemavalidator/output.c (revision 6c5d2f34188e568d8fb59d0666f3359c8e5197f8)
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