#pragma once #include #include #include #include #include #include #include struct IkarusFunctionContext { public: explicit IkarusFunctionContext(struct IkarusProject * project); IkarusFunctionContext(IkarusFunctionContext const&) noexcept = default; IkarusFunctionContext(IkarusFunctionContext&&) noexcept = default; auto operator=(IkarusFunctionContext const&) noexcept -> IkarusFunctionContext& = default; auto operator=(IkarusFunctionContext&&) noexcept -> IkarusFunctionContext& = default; ~IkarusFunctionContext(); public: template requires(std::is_same_v && ...) && (sizeof...(Infos) <= MAXIMUM_ERROR_INFOS) auto set_error(std::string_view error_message, bool log_error, Infos... infos) -> void { if (error_message.size() > _project->error_message_buffer.size()) { _project->error_message_buffer.resize(error_message.size() + 1); } for (int i = 0; i < error_message.size(); ++i) { _project->error_message_buffer[i] = error_message[i]; } _project->error_message_buffer[error_message.size()] = '\0'; _project->error_infos = {infos...}; if (log_error) { LOG_ERROR( "Error({}): {}", fmt::join(_project->error_infos | std::views::transform(get_error_info_name), ", "), error_message ); } } private: struct IkarusProject * _project; };