summaryrefslogtreecommitdiffstats
path: root/src/libnetdata/json/json-c-parser-inline.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnetdata/json/json-c-parser-inline.h')
-rw-r--r--src/libnetdata/json/json-c-parser-inline.h69
1 files changed, 65 insertions, 4 deletions
diff --git a/src/libnetdata/json/json-c-parser-inline.h b/src/libnetdata/json/json-c-parser-inline.h
index c1d60ca45..e51cb232e 100644
--- a/src/libnetdata/json/json-c-parser-inline.h
+++ b/src/libnetdata/json/json-c-parser-inline.h
@@ -25,6 +25,45 @@
} \
} while(0)
+#define JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, member, dst, error, required) do { \
+ json_object *_j; \
+ if (json_object_object_get_ex(jobj, member, &_j) && json_object_is_type(_j, json_type_string)) { \
+ freez((void *)dst); \
+ dst = strdupz(json_object_get_string(_j)); \
+ } \
+ else if(required) { \
+ buffer_sprintf(error, "missing or invalid type for '%s.%s' string", path, member); \
+ return false; \
+ } \
+} while(0)
+
+#define JSONC_PARSE_TXT2UUID_OR_ERROR_AND_RETURN(jobj, path, member, dst, error, required) do { \
+ json_object *_j; \
+ if (json_object_object_get_ex(jobj, member, &_j)) { \
+ if (json_object_is_type(_j, json_type_string)) { \
+ if (uuid_parse(json_object_get_string(_j), dst) != 0) { \
+ if(required) { \
+ buffer_sprintf(error, "invalid UUID '%s.%s'", path, member); \
+ return false; \
+ } \
+ else \
+ uuid_clear(dst); \
+ } \
+ } \
+ else if (json_object_is_type(_j, json_type_null)) { \
+ uuid_clear(dst); \
+ } \
+ else if (required) { \
+ buffer_sprintf(error, "expected UUID or null '%s.%s'", path, member); \
+ return false; \
+ } \
+ } \
+ else if (required) { \
+ buffer_sprintf(error, "missing UUID '%s.%s'", path, member); \
+ return false; \
+ } \
+} while(0)
+
#define JSONC_PARSE_TXT2BUFFER_OR_ERROR_AND_RETURN(jobj, path, member, dst, error, required) do { \
json_object *_j; \
if (json_object_object_get_ex(jobj, member, &_j) && json_object_is_type(_j, json_type_string)) { \
@@ -111,7 +150,6 @@
} \
} while(0)
-
#define JSONC_PARSE_TXT2ENUM_OR_ERROR_AND_RETURN(jobj, path, member, converter, dst, error, required) do { \
json_object *_j; \
if (json_object_object_get_ex(jobj, member, &_j) && json_object_is_type(_j, json_type_string)) \
@@ -122,11 +160,11 @@
} \
} while(0)
-#define JSONC_PARSE_INT_OR_ERROR_AND_RETURN(jobj, path, member, dst, error, required) do { \
+#define JSONC_PARSE_INT64_OR_ERROR_AND_RETURN(jobj, path, member, dst, error, required) do { \
json_object *_j; \
if (json_object_object_get_ex(jobj, member, &_j)) { \
if (_j != NULL && json_object_is_type(_j, json_type_int)) \
- dst = json_object_get_int(_j); \
+ dst = json_object_get_int64(_j); \
else if (_j != NULL && json_object_is_type(_j, json_type_double)) \
dst = (typeof(dst))json_object_get_double(_j); \
else if (_j == NULL) \
@@ -136,7 +174,26 @@
return false; \
} \
} else if(required) { \
- buffer_sprintf(error, "missing or invalid type (expected int value or null) for '%s.%s'", path, member); \
+ buffer_sprintf(error, "missing or invalid type (expected int value or null) for '%s.%s'", path, member);\
+ return false; \
+ } \
+} while(0)
+
+#define JSONC_PARSE_UINT64_OR_ERROR_AND_RETURN(jobj, path, member, dst, error, required) do { \
+ json_object *_j; \
+ if (json_object_object_get_ex(jobj, member, &_j)) { \
+ if (_j != NULL && json_object_is_type(_j, json_type_int)) \
+ dst = json_object_get_uint64(_j); \
+ else if (_j != NULL && json_object_is_type(_j, json_type_double)) \
+ dst = (typeof(dst))json_object_get_double(_j); \
+ else if (_j == NULL) \
+ dst = 0; \
+ else { \
+ buffer_sprintf(error, "not supported type (expected int) for '%s.%s'", path, member); \
+ return false; \
+ } \
+ } else if(required) { \
+ buffer_sprintf(error, "missing or invalid type (expected int value or null) for '%s.%s'", path, member);\
return false; \
} \
} while(0)
@@ -174,4 +231,8 @@
} \
} while(0)
+typedef bool (*json_parse_function_payload_t)(json_object *jobj, const char *path, void *data, BUFFER *error);
+int rrd_call_function_error(BUFFER *wb, const char *msg, int code);
+struct json_object *json_parse_function_payload_or_error(BUFFER *output, BUFFER *payload, int *code, json_parse_function_payload_t cb, void *cb_data);
+
#endif //NETDATA_JSON_C_PARSER_INLINE_H