11#ifndef INCLUDE_ARK_TYPECHECKER_HPP
12#define INCLUDE_ARK_TYPECHECKER_HPP
26 template <
typename T,
typename... Ts>
27 using AllSame = std::enable_if_t<std::conjunction_v<std::is_same<T, Ts>...>>;
30 [[nodiscard]]
bool checkN(
const std::vector<Value>& args)
32 return I >= args.size();
35 template <
int I,
typename T,
typename... Ts>
36 [[nodiscard]]
bool checkN(
const std::vector<Value>& args, T type, Ts... xs)
38 if (I >= args.size() || (type !=
ValueType::Any && args[I].valueType() != type))
54 [[nodiscard]]
bool check(
const std::vector<Value>& args, Ts... types)
56 if (
sizeof...(types) != args.size())
71 Typedef(
const std::string& type_name,
const ValueType type,
const bool is_variadic =
false) :
72 name(type_name), types { type }, variadic(is_variadic)
75 Typedef(
const std::string& type_name,
const std::vector<ValueType>& type_list,
const bool is_variadic =
false) :
76 name(type_name), types(type_list), variadic(is_variadic)
99 const std::string_view& funcname,
100 const std::vector<Contract>& contracts,
101 const std::vector<Value>& args,
102 std::ostream& os = std::cout,
103 bool colorize =
true);
108 TypeCheckingError(std::string&& funcname,
const std::vector<Contract>& contracts,
const std::vector<Value>& args) :
109 Error(
"TypeCheckingError"),
110 m_funcname(std::move(funcname)),
111 m_contracts(contracts),
115 [[nodiscard]] std::string
details(
const bool colorize)
const override
117 std::stringstream stream;
118 generateError(m_funcname, m_contracts, m_passed_args, stream, colorize);
ArkScript homemade exceptions.
Default value type handled by the virtual machine.
std::vector< Contract > m_contracts
std::string details(const bool colorize) const override
std::vector< Value > m_passed_args
TypeCheckingError(std::string &&funcname, const std::vector< Contract > &contracts, const std::vector< Value > &args)
std::enable_if_t< std::conjunction_v< std::is_same< T, Ts >... > > AllSame
bool checkN(const std::vector< Value > &args)
bool check(const std::vector< Value > &args, Ts... types)
Helper to see if a builtin has been given a wanted set of types.
ARK_API void generateError(const std::string_view &funcname, const std::vector< Contract > &contracts, const std::vector< Value > &args, std::ostream &os=std::cout, bool colorize=true)
Generate an error message based on a given set of types contracts provided argument list.
@ Any
Used only for typechecking.
A contract is a list of typed arguments that a function can follow.
std::vector< Typedef > arguments
A type definition within a contract.
Typedef(const std::string &type_name, const std::vector< ValueType > &type_list, const bool is_variadic=false)
Typedef(const std::string &type_name, const ValueType type, const bool is_variadic=false)
std::vector< ValueType > types