#pragma once #include #include "openvic/types/Colour.hpp" #include "openvic/types/Date.hpp" #include "openvic/types/Return.hpp" #include "openvic/types/fixed_point/FP.hpp" #include namespace OpenVic { namespace ast = ovdl::v2script::ast; namespace NodeTools { template return_t expect_type(ast::NodeCPtr node, std::function callback); return_t expect_identifier(ast::NodeCPtr node, std::function callback); return_t expect_string(ast::NodeCPtr node, std::function callback); return_t expect_identifier_or_string(ast::NodeCPtr node, std::function callback); return_t expect_bool(ast::NodeCPtr node, std::function callback); return_t expect_int(ast::NodeCPtr node, std::function callback); return_t expect_uint(ast::NodeCPtr node, std::function callback); return_t expect_fixed_point(ast::NodeCPtr node, std::function callback); return_t expect_colour(ast::NodeCPtr node, std::function callback); return_t expect_date(ast::NodeCPtr node, std::function callback); return_t expect_assign(ast::NodeCPtr node, std::function callback); static const std::function default_length_callback = [](size_t size) -> size_t { return size; }; template requires requires(T& t) { { t.size() } -> std::same_as; t.reserve( size_t {} ); } std::function reserve_length_callback(T& t) { return [&t](size_t size) -> size_t { t.reserve(t.size() + size); return size; }; } return_t expect_list_and_length(ast::NodeCPtr node, std::function length_callback, std::function callback, bool file_node = false); return_t expect_list_of_length(ast::NodeCPtr node, std::function callback, size_t length, bool file_node = false); return_t expect_list(ast::NodeCPtr node, std::function callback, bool file_node = false); return_t expect_dictionary_and_length(ast::NodeCPtr node, std::function length_callback, std::function callback, bool file_node = false); return_t expect_dictionary(ast::NodeCPtr node, std::function callback, bool file_node = false); static const std::function success_callback = [](ast::NodeCPtr) -> return_t { return SUCCESS; }; struct dictionary_entry_t { bool must_appear, can_repeat; std::function callback; }; using dictionary_key_map_t = std::map>; return_t expect_dictionary_keys(ast::NodeCPtr node, dictionary_key_map_t const& keys, bool allow_other_keys = false, bool file_node = false); } }