#pragma once #include #include #include #include #include #include #include #include namespace Fig { namespace Builtins { /* // error's interface like: interface Error { toString() -> String; getErrorClass() -> String; getErrorMessage() -> String; } */ const TypeInfo &getErrorInterfaceTypeInfo(); const TypeInfo &getTypeErrorStructTypeInfo(); /* interface Operation { add(..., ...) -> ...; } */ const TypeInfo &getOperationInterfaceTypeInfo(); const std::unordered_map &getBuiltinValues(); using BuiltinFunction = std::function &)>; const std::unordered_map &getBuiltinFunctionArgCounts(); const std::unordered_map &getBuiltinFunctions(); inline bool isBuiltinFunction(const String &name) { return getBuiltinFunctions().find(name) != getBuiltinFunctions().end(); } inline BuiltinFunction getBuiltinFunction(const String &name) { auto it = getBuiltinFunctions().find(name); if (it == getBuiltinFunctions().end()) { throw RuntimeError(String(std::format("Builtin function '{}' not found", name.toBasicString()))); } return it->second; } inline int getBuiltinFunctionParamCount(const String &name) { auto it = getBuiltinFunctionArgCounts().find(name); if (it == getBuiltinFunctionArgCounts().end()) { throw RuntimeError(String(std::format("Builtin function '{}' not found", name.toBasicString()))); } return it->second; } }; // namespace Builtins }; // namespace Fig.