From 4e850fd21c223a1f5df95e8fd363ffc379a29e15 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Sun, 4 Jan 2026 19:02:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B2=D0=BD?= =?UTF-8?q?=D1=83=D1=82=D1=80=D0=B5=D0=BD=D0=BD=D0=B5=D0=B9=20=D0=B1=D0=B8?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20=D1=81=20?= =?UTF-8?q?=D0=B2=D1=81=D0=BF=D0=BE=D0=BC=D0=BE=D0=B3=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ncui/lib/common.d | 89 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 source/ncui/lib/common.d diff --git a/source/ncui/lib/common.d b/source/ncui/lib/common.d new file mode 100644 index 0000000..38b8817 --- /dev/null +++ b/source/ncui/lib/common.d @@ -0,0 +1,89 @@ +module ncui.lib.common; + +import std.traits : isCallable; +import std.exception : enforce; +import std.format : format; + +import deimos.ncurses : OK; + +/** + * Вызывает функцию `fn`, проверяет её результат на равенство ожидаемому значению + * и при несоответствии бросает исключение с подробным сообщением и местом вызова. + * + * Параметры шаблона: + * - `fn` — вызываемая функция. + * - `Expected` — тип ожидаемого значения `answer`. + * - `Args...` — типы аргументов, которые будут переданы в `fn`. + * + * Параметры: + * - `answer` — ожидаемое значение результата функции `fn`. + * - `message` — пользовательское сообщение (контекст ошибки) (по умолчанию подставляется "Function call error"). + * - `file` — файл места вызова (по умолчанию подставляется `__FILE__`). + * - `line` — строка места вызова (по умолчанию подставляется `__LINE__`). + * - `module_` — модуль места вызова (по умолчанию подставляется `__MODULE__`). + * - `function_` — функция места вызова (по умолчанию подставляется `__FUNCTION__`). + * - `args` — аргументы, которые будут переданы в `fn`. + * + * Возвращает: + * Возвращает фактический результат вызова `fn(args)` (тот же тип, что и у `fn`). + * + * Исключения: + * Бросает `Exception`, если `fn(args)` вернул значение, отличающееся от `answer`. + */ +auto ncuiCall(alias fn, Expected, Args...)( + Expected answer, + string message = "Function returned an error", + string file = __FILE__, + size_t line = __LINE__, + string module_ = __MODULE__, + string function_ = __FUNCTION__, + Args args) if (isCallable!fn) +{ + auto result = fn(args); + + enforce(result == answer, new Exception( + format("%s: %s() returned=%s expected=%s [%s:%s | %s | %s]", + message, __traits(identifier, fn), result, answer, file, line, module_, function_) + )); + + return result; +} + +/** + * Вызывает функцию `fn`, которая должна вернуть ненулевой указатель, и проверяет, + * что результат не `null`. + * + * Параметры шаблона: + * - `fn` — вызываемая функция (передаётся как `alias`, определяется на этапе компиляции). + * - `Args...` — типы аргументов, которые будут переданы в `fn`. + * + * Параметры: + * - `file` — файл места вызова (по умолчанию подставляется `__FILE__`). + * - `line` — строка места вызова (по умолчанию подставляется `__LINE__`). + * - `module_` — модуль места вызова (по умолчанию подставляется `__MODULE__`). + * - `function_` — функция места вызова (по умолчанию подставляется `__FUNCTION__`). + * - `args` — аргументы, передаваемые в `fn`. + * + * Возвращает: + * Возвращает результат `fn(args)` (ожидается указатель), если он не `null`. + * + * Исключения: + * Бросает `Exception`, если `fn(args)` вернул `null`. + */ +auto ncuiNotNull(alias fn, Args...)( + string file = __FILE__, + size_t line = __LINE__, + string module_ = __MODULE__, + string function_ = __FUNCTION__, + Args args +) if (isCallable!fn) +{ + auto result = fn(args); + + enforce(result !is null, new Exception( + format("%s() returned null [%s:%s | %s | %s]", + __traits(identifier, fn), file, line, module_, function_) + )); + + return result; +}