#pragma once #include #include #include #include #include #include #include #include namespace vcpkg::Commands { using CommandTypeA = void (*)(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet); using CommandTypeB = void (*)(const VcpkgCmdArguments& args, const VcpkgPaths& paths); using CommandTypeC = void (*)(const VcpkgCmdArguments& args); namespace BuildExternal { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet); } namespace CI { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet); } namespace Env { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet); } namespace Create { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Upgrade { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet); } namespace Edit { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace DependInfo { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Search { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace List { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Owns { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Cache { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Import { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Integrate { extern const char* const INTEGRATE_COMMAND_HELPSTRING; extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace PortsDiff { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Autocomplete { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Version { const char* base_version(); const std::string& version(); void warn_if_vcpkg_version_mismatch(const VcpkgPaths& paths); void perform_and_exit(const VcpkgCmdArguments& args); } namespace Contact { extern const CommandStructure COMMAND_STRUCTURE; const std::string& email(); void perform_and_exit(const VcpkgCmdArguments& args); } namespace X_VSInstances { extern const CommandStructure COMMAND_STRUCTURE; void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Hash { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } namespace Fetch { void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); } template struct PackageNameAndFunction { std::string name; T function; }; Span> get_available_commands_type_a(); Span> get_available_commands_type_b(); Span> get_available_commands_type_c(); template T find(const std::string& command_name, const std::vector> available_commands) { for (const PackageNameAndFunction& cmd : available_commands) { if (cmd.name == command_name) { return cmd.function; } } // not found return nullptr; } }