neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

validate.h (2643B)


      1 #pragma once
      2 
      3 #include <stdbool.h>
      4 #include <stddef.h>
      5 
      6 #include "nvim/api/private/defs.h"  // IWYU pragma: keep
      7 #include "nvim/api/private/helpers.h"
      8 #include "nvim/assert_defs.h"
      9 #include "nvim/macros_defs.h"
     10 
     11 #define VALIDATE(cond, fmt_, fmt_arg1, code) \
     12  do { \
     13    if (!(cond)) { \
     14      api_set_error(err, kErrorTypeValidation, fmt_, fmt_arg1); \
     15      code; \
     16    } \
     17  } while (0)
     18 
     19 #define VALIDATE_INT(cond, name, val_, code) \
     20  do { \
     21    if (!(cond)) { \
     22      api_err_invalid(err, name, NULL, val_, false); \
     23      code; \
     24    } \
     25  } while (0)
     26 
     27 #define VALIDATE_S(cond, name, val_, code) \
     28  do { \
     29    if (!(cond)) { \
     30      api_err_invalid(err, name, val_, 0, true); \
     31      code; \
     32    } \
     33  } while (0)
     34 
     35 #define VALIDATE_EXP(cond, name, expected, actual, code) \
     36  do { \
     37    if (!(cond)) { \
     38      api_err_exp(err, name, expected, actual); \
     39      code; \
     40    } \
     41  } while (0)
     42 
     43 #define VALIDATE_T(name, expected_t, actual_t, code) \
     44  do { \
     45    STATIC_ASSERT(expected_t != kObjectTypeDict, "use VALIDATE_T_DICT"); \
     46    if (expected_t != actual_t) { \
     47      api_err_exp(err, name, api_typename(expected_t), api_typename(actual_t)); \
     48      code; \
     49    } \
     50  } while (0)
     51 
     52 /// Checks that `obj_` has type `expected_t`.
     53 #define VALIDATE_T2(obj_, expected_t, code) \
     54  do { \
     55    STATIC_ASSERT(expected_t != kObjectTypeDict, "use VALIDATE_T_DICT"); \
     56    if ((obj_).type != expected_t) { \
     57      api_err_exp(err, STR(obj_), api_typename(expected_t), api_typename((obj_).type)); \
     58      code; \
     59    } \
     60  } while (0)
     61 
     62 /// Checks that `obj_` has Dict type. Also allows empty Array in a Lua context.
     63 #define VALIDATE_T_DICT(name, obj_, code) \
     64  do { \
     65    if ((obj_).type != kObjectTypeDict \
     66        && !(channel_id == LUA_INTERNAL_CALL \
     67             && (obj_).type == kObjectTypeArray \
     68             && (obj_).data.array.size == 0)) { \
     69      api_err_exp(err, name, api_typename(kObjectTypeDict), api_typename((obj_).type)); \
     70      code; \
     71    } \
     72  } while (0)
     73 
     74 /// Checks that actual_t is either the correct handle type or a type erased handle (integer)
     75 #define VALIDATE_T_HANDLE(name, expected_t, actual_t, code) \
     76  do { \
     77    if (expected_t != actual_t && kObjectTypeInteger != actual_t) { \
     78      api_err_exp(err, name, api_typename(expected_t), api_typename(actual_t)); \
     79      code; \
     80    } \
     81  } while (0)
     82 
     83 #define VALIDATE_RANGE(cond, name, code) \
     84  do { \
     85    if (!(cond)) { \
     86      api_err_invalid(err, name, "out of range", 0, false); \
     87      code; \
     88    } \
     89  } while (0)
     90 
     91 #define VALIDATE_R(cond, name, code) \
     92  VALIDATE(cond, "Required: '%s'", name, code);
     93 
     94 #include "api/private/validate.h.generated.h"