#pragma once #include #include #include #include #include #include #include #include namespace vcpkg::Parse { struct ParseControlErrorInfo { std::string name; std::map> missing_fields; std::map> extra_fields; std::map expected_types; std::map> mutually_exclusive_fields; std::string error; bool has_error() const { return !missing_fields.empty() || !extra_fields.empty() || !expected_types.empty() || !error.empty(); } }; template using ParseExpected = vcpkg::ExpectedT, std::unique_ptr>; using Paragraph = std::unordered_map>; struct ParagraphParser { ParagraphParser(Paragraph&& fields) : fields(std::move(fields)) { } std::string required_field(const std::string& fieldname); void required_field(const std::string& fieldname, std::string& out); void required_field(const std::string& fieldname, std::pair out); std::string optional_field(const std::string& fieldname); void optional_field(const std::string& fieldname, std::pair out); void add_type_error(const std::string& fieldname, const char* type) { expected_types[fieldname] = type; } std::unique_ptr error_info(const std::string& name) const; private: Paragraph&& fields; std::vector missing_fields; std::map expected_types; }; ExpectedS> parse_default_features_list(const std::string& str, StringView origin = "", TextRowCol textrowcol = {}); ExpectedS> parse_qualified_specifier_list(const std::string& str, StringView origin = "", TextRowCol textrowcol = {}); ExpectedS> parse_dependencies_list(const std::string& str, StringView origin = "", TextRowCol textrowcol = {}); }