aboutsummaryrefslogtreecommitdiff
path: root/libbutl/manifest-rewriter.mxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-12-15 17:23:37 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-12-15 17:27:56 +0300
commit3bf1846063ad30ecc0fc90d34490bf70776faef0 (patch)
tree8a2a248be187671f8d9fd75d3367bfb9de782e45 /libbutl/manifest-rewriter.mxx
parent5bff24a8862f61e40f827591be5c81228efab4c6 (diff)
Add manifest_rewriter class
Diffstat (limited to 'libbutl/manifest-rewriter.mxx')
-rw-r--r--libbutl/manifest-rewriter.mxx75
1 files changed, 75 insertions, 0 deletions
diff --git a/libbutl/manifest-rewriter.mxx b/libbutl/manifest-rewriter.mxx
new file mode 100644
index 0000000..3261ef2
--- /dev/null
+++ b/libbutl/manifest-rewriter.mxx
@@ -0,0 +1,75 @@
+// file : libbutl/manifest-rewriter.mxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef __cpp_modules
+#pragma once
+#endif
+
+// C includes.
+
+#ifndef __cpp_lib_modules
+#endif
+
+// Other includes.
+
+#ifdef __cpp_modules
+export module butl.manifest_rewriter;
+#ifdef __cpp_lib_modules
+#endif
+import butl.path;
+import butl.fdstream;
+import butl.manifest_types;
+#else
+#include <libbutl/path.mxx>
+#include <libbutl/fdstream.mxx>
+#include <libbutl/manifest-types.mxx>
+#endif
+
+#include <libbutl/export.hxx>
+
+LIBBUTL_MODEXPORT namespace butl
+{
+ // Rewrite a hand-written manifest file preserving formatting, comments,
+ // etc., of the unaffected parts. The general workflow is as follows:
+ //
+ // 1. Parse the manifest file using manifest_parser into a sequence of
+ // name/value pairs and their positions.
+ //
+ // 2. Create an instance of manifest_rewriter for the manifest file. This
+ // opens the file in read/write mode with exclusive access.
+ //
+ // 3. Iterate over this sequence in reverse and apply changes to the desired
+ // name/value pairs using the below API. Doing this in reverse makes sure
+ // the positions obtained on step 1 remain valid.
+ //
+ // Note that if an exception is thrown by replace() or insert(), then the
+ // writer is no longer usable and there is no guarantees that the file is
+ // left in a consistent state.
+ //
+ class LIBBUTL_SYMEXPORT manifest_rewriter
+ {
+ public:
+ manifest_rewriter (path);
+
+ // Replace the existing value at the specified position (specifically,
+ // between colon_pos and end_pos) with the specified new value. The new
+ // value is serialized as if by manifest_serializer.
+ //
+ void
+ replace (const manifest_name_value&);
+
+ // Insert a new name/value after the specified position (specifically,
+ // after end_pos). To insert before the first value, use the special
+ // start-of-manifest value as position. The new name/value is serialized
+ // as if by manifest_serializer. Throw manifest_serialization exception
+ // on error.
+ //
+ void
+ insert (const manifest_name_value& pos, const manifest_name_value&);
+
+ private:
+ path path_;
+ auto_fd fd_;
+ };
+}