19 for (std::size_t i = 0, end = types.size(); i < end; ++i)
30 auto displayArg = [](
const Typedef& td,
bool correct) {
33 std::cout <<
" -> " << (td.
variadic ?
"variadic " :
"")
34 << (correct ? termcolor::green : termcolor::magenta) << td.
name << termcolor::reset <<
" (" << arg_str <<
") ";
37 for (std::size_t i = 0, end = contract.
arguments.size(); i < end; ++i)
44 std::size_t bad_type = 0;
45 for (std::size_t j = i, args_end = args.size(); j < args_end; ++j)
53 displayArg(td,
false);
54 std::cout << termcolor::red << bad_type << termcolor::reset
55 <<
" argument" << (bad_type > 1 ?
"s" :
"") <<
" do not match";
65 displayArg(td,
false);
66 std::cout <<
"was of type " << termcolor::red << types_to_str[static_cast<std::size_t>(args[i].valueType())];
69 else if (i >= args.size())
71 displayArg(td,
false);
72 std::cout << termcolor::red <<
"was not provided";
77 std::cout << termcolor::reset <<
"\n";
81 [[noreturn]]
void generateError(std::string_view funcname,
const std::vector<Contract>& contracts,
const std::vector<Value>& args)
83 std::cout <<
"Function " << termcolor::blue << funcname << termcolor::reset <<
" expected ";
85 std::vector<Value> sanitizedArgs;
86 std::copy_if(args.begin(), args.end(), std::back_inserter(sanitizedArgs), [](
const Value& value) ->
bool {
87 return value.valueType() != ValueType::Undefined;
91 std::size_t min_argc = std::numeric_limits<std::size_t>::max(), max_argc = 0;
94 if (c.arguments.size() < min_argc)
95 min_argc = c.arguments.size();
96 if (c.arguments.size() > max_argc)
97 max_argc = c.arguments.size();
100 bool correct_argcount =
true;
102 if (min_argc != max_argc)
104 std::cout <<
"between "
105 << termcolor::yellow << min_argc << termcolor::reset
106 <<
" argument" << (min_argc > 1 ?
"s" :
"") <<
" and "
107 << termcolor::yellow << max_argc << termcolor::reset
108 <<
" argument" << (max_argc > 1 ?
"s" :
"");
110 if (sanitizedArgs.size() < min_argc || sanitizedArgs.size() > max_argc)
111 correct_argcount =
false;
115 std::cout << termcolor::yellow << min_argc << termcolor::reset
116 <<
" argument" << (min_argc > 1 ?
"s" :
"");
118 if (sanitizedArgs.size() != min_argc)
119 correct_argcount =
false;
122 if (!correct_argcount)
123 std::cout <<
" but got " << termcolor::red << sanitizedArgs.size();
125 std::cout << termcolor::reset <<
"\n";
128 for (std::size_t i = 1, end = contracts.size(); i < end; ++i)
130 std::cout <<
"Alternative " << (i + 1) <<
":\n";
ArkScript homemade exceptions.
A type error triggered when types don't match.
ARK_API void generateError(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.
void displayContract(const Contract &contract, const std::vector< Value > &args)
std::string typeListToString(const std::vector< ValueType > &types)
const std::array< std::string, 13 > types_to_str
A contract is a list of typed arguments that a function can follow.
std::vector< Typedef > arguments
A type definition within a contract.
std::vector< ValueType > types