30 auto displayArg = [](
const Typedef& td,
bool correct) {
39 ? fmt::fg(fmt::color::green)
40 : fmt::fg(fmt::color::magenta)),
44 for (std::size_t i = 0, end = contract.
arguments.size(); i < end; ++i)
51 std::size_t bad_type = 0;
52 for (std::size_t j = i, args_end = args.size(); j < args_end; ++j)
60 displayArg(td,
false);
61 fmt::print(
"{} argument{} do not match", fmt::styled(bad_type, fmt::fg(fmt::color::red)), bad_type > 1 ?
"s" :
"");
71 displayArg(td,
false);
72 fmt::print(
"was of type {}", fmt::styled(
types_to_str[
static_cast<std::size_t
>(args[i].valueType())], fmt::fg(fmt::color::red)));
75 else if (i >= args.size())
77 displayArg(td,
false);
78 fmt::print(fmt::fg(fmt::color::red),
"was not provided");
87 [[noreturn]]
void generateError(
const std::string_view& funcname,
const std::vector<Contract>& contracts,
const std::vector<Value>& args)
89 fmt::print(
"Function {} expected ", fmt::styled(funcname, fmt::fg(fmt::color::blue)));
91 std::vector<Value> sanitizedArgs;
92 std::ranges::copy_if(args, std::back_inserter(sanitizedArgs), [](
const Value& value) ->
bool {
97 std::size_t min_argc = std::numeric_limits<std::size_t>::max(), max_argc = 0;
98 for (
const auto& [arguments] : contracts)
100 if (arguments.size() < min_argc)
101 min_argc = arguments.size();
102 if (arguments.size() > max_argc)
103 max_argc = arguments.size();
106 bool correct_argcount =
true;
108 if (min_argc != max_argc)
111 "between {} argument{} and {} argument{}",
112 fmt::styled(min_argc, fmt::fg(fmt::color::yellow)),
113 min_argc > 1 ?
"s" :
"",
114 fmt::styled(max_argc, fmt::fg(fmt::color::yellow)),
115 max_argc > 1 ?
"s" :
"");
117 if (sanitizedArgs.size() < min_argc || sanitizedArgs.size() > max_argc)
118 correct_argcount =
false;
122 fmt::print(
"{} argument{}", fmt::styled(min_argc, fmt::fg(fmt::color::yellow)), min_argc > 1 ?
"s" :
"");
124 if (sanitizedArgs.size() != min_argc)
125 correct_argcount =
false;
128 if (!correct_argcount)
129 fmt::print(
" but got {}", fmt::styled(sanitizedArgs.size(), fmt::fg(fmt::color::red)));
134 for (std::size_t i = 1, end = contracts.size(); i < end; ++i)
136 std::cout <<
"Alternative " << (i + 1) <<
":\n";
ARK_API void generateError(const std::string_view &funcname, const std::vector< Contract > &contracts, const std::vector< Value > &args)
Generate an error message based on a given set of types contracts provided argument list.