aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/private/validate.h
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2023-02-14 05:19:04 -0500
committerGitHub <noreply@github.com>2023-02-14 02:19:04 -0800
commit46a87a5d2bac598fed0870f0d3c926087f95d30f (patch)
tree500dba055ff89fcc0610e7a497d7a4471bff04f1 /src/nvim/api/private/validate.h
parent53968082675cd3b8d1809e53a47c0311b7347ef9 (diff)
downloadrneovim-46a87a5d2bac598fed0870f0d3c926087f95d30f.tar.gz
rneovim-46a87a5d2bac598fed0870f0d3c926087f95d30f.tar.bz2
rneovim-46a87a5d2bac598fed0870f0d3c926087f95d30f.zip
refactor(api): VALIDATE macros #22187
Problem: - API validation involves too much boilerplate. - API validation errors are not consistently worded. Solution: Introduce some macros. Currently these are clumsy, but they at least help with consistency and avoid some nesting.
Diffstat (limited to 'src/nvim/api/private/validate.h')
-rw-r--r--src/nvim/api/private/validate.h69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/nvim/api/private/validate.h b/src/nvim/api/private/validate.h
new file mode 100644
index 0000000000..8448b416be
--- /dev/null
+++ b/src/nvim/api/private/validate.h
@@ -0,0 +1,69 @@
+#ifndef NVIM_API_PRIVATE_VALIDATE_H
+#define NVIM_API_PRIVATE_VALIDATE_H
+
+#include "nvim/api/private/defs.h"
+#include "nvim/api/private/helpers.h"
+
+#define VALIDATE_INT(cond, name, val_, code) \
+ do { \
+ if (!(cond)) { \
+ api_set_error(err, kErrorTypeValidation, "Invalid " name ": %" PRId64, val_); \
+ code; \
+ } \
+ } while (0)
+
+#define VALIDATE_S(cond, name, val_, code) \
+ do { \
+ if (!(cond)) { \
+ if (strequal(val_, "")) { \
+ api_set_error(err, kErrorTypeValidation, "Invalid " name); \
+ } else { \
+ api_set_error(err, kErrorTypeValidation, "Invalid " name ": '%s'", val_); \
+ } \
+ code; \
+ } \
+ } while (0)
+
+#define VALIDATE_R(cond, name, code) \
+ do { \
+ if (!(cond)) { \
+ api_set_error(err, kErrorTypeValidation, "'" name "' is required"); \
+ code; \
+ } \
+ } while (0)
+
+#define VALIDATE_EXP(cond, name, expected, actual, code) \
+ do { \
+ if (!(cond)) { \
+ api_set_error(err, kErrorTypeValidation, "Invalid " name ": expected %s, got %s", \
+ expected, actual); \
+ code; \
+ } \
+ } while (0)
+
+#define VALIDATE_T(name, expected_t, actual_t, code) \
+ do { \
+ if (expected_t != actual_t) { \
+ api_set_error(err, kErrorTypeValidation, "Invalid %s: expected %s, got %s", \
+ name, api_typename(expected_t), api_typename(actual_t)); \
+ code; \
+ } \
+ } while (0)
+
+#define VALIDATE(cond, msg_, code) \
+ do { \
+ if (!(cond)) { \
+ api_set_error(err, kErrorTypeValidation, "%s", msg_); \
+ code; \
+ } \
+ } while (0)
+
+#define VALIDATE_FMT(cond, fmt_, msg_, code) \
+ do { \
+ if (!(cond)) { \
+ api_set_error(err, kErrorTypeValidation, fmt_, msg_); \
+ code; \
+ } \
+ } while (0)
+
+#endif // NVIM_API_PRIVATE_VALIDATE_H