Модуль со вспомогательными функциями-проверками был переименован и изменен
This commit is contained in:
parent
b276be12bc
commit
9f36aa0973
2 changed files with 124 additions and 89 deletions
124
source/ncui/lib/checks.d
Normal file
124
source/ncui/lib/checks.d
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
module ncui.lib.checks;
|
||||
|
||||
import std.traits : isCallable, isPointer;
|
||||
import std.exception : enforce;
|
||||
import std.format : format;
|
||||
|
||||
import deimos.ncurses : ERR;
|
||||
|
||||
/**
|
||||
* Возвращает имя функции `fn` для сообщений об ошибках.
|
||||
*/
|
||||
private string _fnName(alias fn)()
|
||||
{
|
||||
return __traits(identifier, fn);
|
||||
}
|
||||
|
||||
/**
|
||||
* Вызывает `fn(args)` и строго проверяет, что результат равен `expected`.
|
||||
*
|
||||
* - Тип `expected` обязан совпадать с типом результата `fn`.
|
||||
* - При несоответствии бросает исключение с местом вызова.
|
||||
*/
|
||||
auto ncuiExpect(alias fn, Expected, Args...)(
|
||||
Expected expected,
|
||||
Args args,
|
||||
string file = __FILE__,
|
||||
size_t line = __LINE__,
|
||||
string module_ = __MODULE__,
|
||||
string function_ = __FUNCTION__
|
||||
) if (isCallable!fn && __traits(compiles, fn(args)))
|
||||
{
|
||||
auto result = fn(args);
|
||||
|
||||
static assert(is(typeof(result) == Expected),
|
||||
format("ncuiExpect: expected type must match the result type %s().", _fnName!fn));
|
||||
|
||||
enforce(result == expected, format(
|
||||
"Unexpected return value: %s() returned=%s expected=%s [%s:%s | %s | %s]",
|
||||
_fnName!fn, result, expected, file, line, module_, function_
|
||||
));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Вызывает `fn(args)` и строго проверяет, что результат равен `expected`.
|
||||
*
|
||||
* - Тип `expected` обязан совпадать с типом результата `fn`.
|
||||
* - При несоответствии бросает исключение с пользовательским сообщением и местом вызова.
|
||||
*/
|
||||
auto ncuiExpectMsg(alias fn, Expected, Args...)(
|
||||
string message,
|
||||
Expected expected,
|
||||
Args args,
|
||||
string file = __FILE__,
|
||||
size_t line = __LINE__,
|
||||
string module_ = __MODULE__,
|
||||
string function_ = __FUNCTION__
|
||||
) if (isCallable!fn && __traits(compiles, fn(args)))
|
||||
{
|
||||
auto result = fn(args);
|
||||
|
||||
static assert(is(typeof(result) == Expected),
|
||||
format("ncuiExpect: expected type must match the result type %s().", _fnName!fn));
|
||||
|
||||
enforce(result == expected, format(
|
||||
"%s: %s() returned=%s expected=%s [%s:%s | %s | %s]",
|
||||
message, _fnName!fn, result, expected, file, line, module_, function_
|
||||
));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Вызывает `fn(args)` и проверяет, что результат не равен `ERR`.
|
||||
*
|
||||
* Требует, чтобы `fn` возвращала тот же тип, что и `ERR`.
|
||||
* При `ERR` бросает исключение с местом вызова.
|
||||
*/
|
||||
int ncuiNotErr(alias fn, Args...)(
|
||||
Args args,
|
||||
string file = __FILE__,
|
||||
size_t line = __LINE__,
|
||||
string module_ = __MODULE__,
|
||||
string function_ = __FUNCTION__
|
||||
) if (isCallable!fn && __traits(compiles, fn(args)))
|
||||
{
|
||||
auto result = fn(args);
|
||||
|
||||
static assert(is(typeof(result) == typeof(ERR)),
|
||||
format("ncuiNotErr expects a function that returns an %s.", typeof(ERR)));
|
||||
|
||||
enforce(result != ERR, format(
|
||||
"Function returned ERR: %s() [%s:%s | %s | %s]",
|
||||
_fnName!fn, file, line, module_, function_
|
||||
));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Вызывает `fn(args)` и проверяет, что результат (указатель) не `null`.
|
||||
*
|
||||
* При `null` бросает исключение с местом вызова.
|
||||
*/
|
||||
auto ncuiNotNull(alias fn, Args...)(
|
||||
Args args,
|
||||
string file = __FILE__,
|
||||
size_t line = __LINE__,
|
||||
string module_ = __MODULE__,
|
||||
string function_ = __FUNCTION__
|
||||
) if (isCallable!fn && __traits(compiles, fn(args)))
|
||||
{
|
||||
auto result = fn(args);
|
||||
|
||||
static assert(isPointer!(typeof(result)),
|
||||
"ncuiNotNull expects a function that returns a pointer.");
|
||||
|
||||
enforce(result !is null, format(
|
||||
"Function returned null: %s() [%s:%s | %s | %s]",
|
||||
_fnName!fn, file, line, module_, function_
|
||||
));
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue