1// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROMEOS_DBUS_BINDINGS_INDENTED_TEXT_H_
6#define CHROMEOS_DBUS_BINDINGS_INDENTED_TEXT_H_
7
8#include <string>
9#include <utility>
10#include <vector>
11
12#include <base/macros.h>
13
14namespace chromeos_dbus_bindings {
15
16class IndentedText {
17 public:
18  IndentedText();
19  virtual ~IndentedText() = default;
20
21  // Insert a blank line.
22  void AddBlankLine();
23
24  // Insert a block of indented text.
25  void AddBlock(const IndentedText& block);
26  void AddBlockWithOffset(const IndentedText& block, size_t shift);
27
28  // Add a line at the current indentation.
29  void AddLine(const std::string& line);
30  void AddLineWithOffset(const std::string& line, size_t shift);
31  // Adds a line and pushes an offset past the |nth_occurrence| of character |c|
32  // in that line, effectively allowing to align following line to the position
33  // following that character.
34  void AddLineAndPushOffsetTo(const std::string& line,
35                              size_t nth_occurrence,
36                              char c);
37
38  // Adds a block of comments.
39  void AddComments(const std::string& doc_string);
40
41  // Return a string representing the indented text.
42  std::string GetContents() const;
43
44  // Return a list of lines representing the intended indented text, not
45  // including the \n.
46  std::vector<std::string> GetLines() const;
47
48  // Add or remove an offset to the current stack of indentation offsets.
49  void PushOffset(size_t shift);
50  void PopOffset();
51
52  // Reset to initial state.
53  void Reset();
54
55
56 private:
57  using IndentedLine = std::pair<std::string, size_t>;
58
59  friend class IndentedTextTest;
60
61  size_t offset_;
62  std::vector<size_t> offset_history_;
63  std::vector<IndentedLine> contents_;
64
65  DISALLOW_COPY_AND_ASSIGN(IndentedText);
66};
67
68}  // namespace chromeos_dbus_bindings
69
70#endif  // CHROMEOS_DBUS_BINDINGS_INDENTED_TEXT_H_
71