aboutsummaryrefslogtreecommitdiff
path: root/bpkg/manifest-serializer
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-06-11 16:53:03 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-06-11 16:53:03 +0200
commitf4660720e3ab0dc70d31fd39d48199590810ab03 (patch)
treeb8396646af57e03855aa93d798920d987fa3b0b7 /bpkg/manifest-serializer
parent2ffe5ac2998b90c004de4f13e199c7ee965c3f75 (diff)
Implement manifest serializer
Diffstat (limited to 'bpkg/manifest-serializer')
-rw-r--r--bpkg/manifest-serializer73
1 files changed, 73 insertions, 0 deletions
diff --git a/bpkg/manifest-serializer b/bpkg/manifest-serializer
new file mode 100644
index 0000000..2c5a09b
--- /dev/null
+++ b/bpkg/manifest-serializer
@@ -0,0 +1,73 @@
+// file : bpkg/manifest-serializer -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BPKG_MANIFEST_SERIALIZER
+#define BPKG_MANIFEST_SERIALIZER
+
+#include <string>
+#include <iosfwd>
+#include <cstddef> // size_t
+#include <stdexcept> // runtime_error
+
+namespace bpkg
+{
+ class manifest_serialization: public std::runtime_error
+ {
+ public:
+ manifest_serialization (const std::string& name,
+ const std::string& description);
+
+ std::string name;
+ std::string description;
+ };
+
+ class manifest_serializer
+ {
+ public:
+ manifest_serializer (std::ostream& os, const std::string& name)
+ : os_ (os), name_ (name) {}
+
+ const std::string&
+ name () const {return name_;}
+
+ // The first name-value pair should be the special "start-of-manifest"
+ // with empty name and value being the format version. After that we
+ // have a sequence of ordinary pairs which are the manifest. At the
+ // end of the manifest we have the special "end-of-manifest" pair
+ // with empty name and value. After that we can either have another
+ // start-of-manifest pair (in which case the whole sequence repeats
+ // from the beginning) or we get another end-of-manifest pair which
+ // signals the end of stream.
+ //
+ void
+ next (const std::string& name, const std::string& value);
+
+ // Write a comment. The supplied text is prefixed with "# " and
+ // terminated with a newline.
+ //
+ void
+ comment (const std::string&);
+
+ private:
+ void
+ check_name (const std::string&);
+
+ // Write 'n' characters from 's' (assuming there are no newlines)
+ // split into multiple lines at or near the 78 characters
+ // boundary. The first line starts at the 'column' offset.
+ //
+ void
+ write_value (std::size_t column, const char* s, std::size_t n);
+
+ private:
+ enum {start, body, end} s_ = start;
+ std::string version_; // Current format version.
+
+ private:
+ std::ostream& os_;
+ const std::string name_;
+ };
+}
+
+#endif // BPKG_MANIFEST_SERIALIZER