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