aboutsummaryrefslogtreecommitdiff
path: root/libbbot/manifest.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbbot/manifest.cxx')
-rw-r--r--libbbot/manifest.cxx39
1 files changed, 31 insertions, 8 deletions
diff --git a/libbbot/manifest.cxx b/libbbot/manifest.cxx
index c52f3e3..06399f2 100644
--- a/libbbot/manifest.cxx
+++ b/libbbot/manifest.cxx
@@ -105,8 +105,8 @@ namespace bbot
// machine_header_manifest
//
machine_header_manifest::
- machine_header_manifest (parser& p, bool iu)
- : machine_header_manifest (p, p.next (), iu)
+ machine_header_manifest (parser& p, unknown_name_mode m)
+ : machine_header_manifest (p, p.next (), m)
{
// Make sure this is the end.
//
@@ -117,7 +117,10 @@ namespace bbot
}
machine_header_manifest::
- machine_header_manifest (parser& p, name_value nv, bool iu)
+ machine_header_manifest (parser& p,
+ name_value nv,
+ unknown_name_mode m,
+ name_value* e)
{
auto bad_name = [&p, &nv] (const string& d)
{
@@ -172,8 +175,18 @@ namespace bbot
summary = move (v);
}
- else if (!iu)
- bad_name ("unknown name '" + n + "' in machine header manifest");
+ else
+ {
+ switch (m)
+ {
+ case unknown_name_mode::skip: continue;
+ case unknown_name_mode::fail:
+ bad_name ("unknown name '" + n + "' in machine header manifest");
+ case unknown_name_mode::stop: break; // Bail out from the loop.
+ }
+
+ break;
+ }
}
// Verify all non-optional values were specified.
@@ -186,10 +199,13 @@ namespace bbot
if (summary.empty ())
bad_value ("no machine summary specified");
+
+ if (e != nullptr)
+ *e = move (nv);
}
void machine_header_manifest::
- serialize (serializer& s) const
+ serialize (serializer& s, bool end_of_manifest) const
{
// @@ Should we check that all non-optional values are specified and all
// values are valid?
@@ -198,7 +214,9 @@ namespace bbot
s.next ("id", id);
s.next ("name", name);
s.next ("summary", summary);
- s.next ("", ""); // End of manifest.
+
+ if (end_of_manifest)
+ s.next ("", ""); // End of manifest.
}
// task_request_manifest
@@ -296,7 +314,12 @@ namespace bbot
// Parse machine header manifests.
//
for (nv = p.next (); !nv.empty (); nv = p.next ())
- machines.emplace_back (machine_header_manifest (p, nv, iu));
+ machines.emplace_back (
+ machine_header_manifest (p,
+ nv,
+ iu
+ ? unknown_name_mode::skip
+ : unknown_name_mode::fail));
if (machines.empty ())
bad_value ("no task request machines specified");