diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2016-09-29 21:54:14 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2016-09-29 23:28:03 +0300 |
commit | 25a9484378ddaae9602ec54532cdc03b1f1924ef (patch) | |
tree | 7aafb613337eb6c6aee4fef78b8345405c4d7f70 /butl/manifest-serializer | |
parent | f4f6d906733027a7bd802e035b3e9852db7be967 (diff) |
Add manifest_parser and manifest_serializer
Diffstat (limited to 'butl/manifest-serializer')
-rw-r--r-- | butl/manifest-serializer | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/butl/manifest-serializer b/butl/manifest-serializer new file mode 100644 index 0000000..6d7eeec --- /dev/null +++ b/butl/manifest-serializer @@ -0,0 +1,75 @@ +// file : butl/manifest-serializer -*- C++ -*- +// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUTL_MANIFEST_SERIALIZER +#define BUTL_MANIFEST_SERIALIZER + +#include <string> +#include <iosfwd> +#include <cstddef> // size_t +#include <stdexcept> // runtime_error + +#include <butl/export> + +namespace butl +{ + class LIBBUTL_EXPORT manifest_serialization: public std::runtime_error + { + public: + manifest_serialization (const std::string& name, + const std::string& description); + + std::string name; + std::string description; + }; + + class LIBBUTL_EXPORT 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 // BUTL_MANIFEST_SERIALIZER |