#pragma once #include #include #include #include #include #include #include namespace vcpkg { struct ParsedArguments { std::unordered_set switches; std::unordered_map settings; std::unordered_map> multisettings; }; struct VcpkgPaths; struct CommandSwitch { constexpr CommandSwitch(const StringLiteral& name, const StringLiteral& short_help_text) : name(name), short_help_text(short_help_text) { } StringLiteral name; StringLiteral short_help_text; }; struct CommandSetting { constexpr CommandSetting(const StringLiteral& name, const StringLiteral& short_help_text) : name(name), short_help_text(short_help_text) { } StringLiteral name; StringLiteral short_help_text; }; struct CommandMultiSetting { constexpr CommandMultiSetting(const StringLiteral& name, const StringLiteral& short_help_text) : name(name), short_help_text(short_help_text) { } StringLiteral name; StringLiteral short_help_text; }; struct CommandOptionsStructure { Span switches; Span settings; Span multisettings; }; struct CommandStructure { std::string example_text; size_t minimum_arity; size_t maximum_arity; CommandOptionsStructure options; std::vector (*valid_arguments)(const VcpkgPaths& paths); }; void display_usage(const CommandStructure& command_structure); #if defined(_WIN32) using CommandLineCharType = wchar_t; #else using CommandLineCharType = char; #endif struct VcpkgCmdArguments { static VcpkgCmdArguments create_from_command_line(const int argc, const CommandLineCharType* const* const argv); static VcpkgCmdArguments create_from_arg_sequence(const std::string* arg_begin, const std::string* arg_end); std::unique_ptr vcpkg_root_dir; std::unique_ptr scripts_root_dir; std::unique_ptr triplet; std::unique_ptr> overlay_ports; std::unique_ptr> overlay_triplets; Optional debug = nullopt; Optional sendmetrics = nullopt; Optional printmetrics = nullopt; // feature flags Optional featurepackages = nullopt; Optional binarycaching = nullopt; std::string command; std::vector command_arguments; ParsedArguments parse_arguments(const CommandStructure& command_structure) const; private: std::unordered_map>> optional_command_arguments; }; }