diff options
| author | Robert Schumacher <roschuma@microsoft.com> | 2017-06-17 02:39:14 -0700 |
|---|---|---|
| committer | Robert Schumacher <roschuma@microsoft.com> | 2017-06-20 09:36:21 -0700 |
| commit | 8741214bf69d1209a1e6d405ed8561d27f04436a (patch) | |
| tree | 85325eb4b2d2c1c15eb8bd58426dac5462242d4e /toolsrc/src/vcpkg_Parse.cpp | |
| parent | 8c4d55b8f304c74aeb95878cfe354830ff4abc88 (diff) | |
| download | vcpkg-8741214bf69d1209a1e6d405ed8561d27f04436a.tar.gz vcpkg-8741214bf69d1209a1e6d405ed8561d27f04436a.zip | |
[vcpkg] Use unique_ptr<> for paragraphs. Post-parser phase rework.
Diffstat (limited to 'toolsrc/src/vcpkg_Parse.cpp')
| -rw-r--r-- | toolsrc/src/vcpkg_Parse.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/toolsrc/src/vcpkg_Parse.cpp b/toolsrc/src/vcpkg_Parse.cpp new file mode 100644 index 000000000..b63ce41a9 --- /dev/null +++ b/toolsrc/src/vcpkg_Parse.cpp @@ -0,0 +1,59 @@ +#include "pch.h" + +#include "vcpkg_Checks.h" +#include "vcpkg_Maps.h" +#include "vcpkg_Parse.h" + +namespace vcpkg::Parse +{ + static Optional<std::string> get_field(const std::unordered_map<std::string, std::string>& fields, + const std::string& fieldname) + { + auto it = fields.find(fieldname); + if (it == fields.end()) + { + return nullopt; + } + + return it->second; + } + + static Optional<std::string> remove_field(std::unordered_map<std::string, std::string>* fields, + const std::string& fieldname) + { + auto it = fields->find(fieldname); + if (it == fields->end()) + { + return nullopt; + } + + const std::string value = std::move(it->second); + fields->erase(it); + return value; + } + + void ParagraphParser::required_field(const std::string& fieldname, std::string& out) + { + auto maybe_field = remove_field(&fields, fieldname); + if (auto field = maybe_field.get()) + out = std::move(*field); + else + missing_fields.push_back(fieldname); + } + std::string ParagraphParser::optional_field(const std::string& fieldname) + { + return remove_field(&fields, fieldname).value_or(""); + } + std::unique_ptr<ParseControlErrorInfo> ParagraphParser::error_info(const std::string& name) const + { + if (!fields.empty() || !missing_fields.empty()) + { + auto err = std::make_unique<ParseControlErrorInfo>(); + err->name = name; + err->extra_fields = Maps::extract_keys(fields); + err->missing_fields = std::move(missing_fields); + return err; + } + return nullptr; + } +} |
