aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/vcpkg_Parse.cpp
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-06-17 02:39:14 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-06-20 09:36:21 -0700
commit8741214bf69d1209a1e6d405ed8561d27f04436a (patch)
tree85325eb4b2d2c1c15eb8bd58426dac5462242d4e /toolsrc/src/vcpkg_Parse.cpp
parent8c4d55b8f304c74aeb95878cfe354830ff4abc88 (diff)
downloadvcpkg-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.cpp59
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;
+ }
+}