// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_LIBXML_CHROMIUM_XML_WRITER_H_
#define THIRD_PARTY_LIBXML_CHROMIUM_XML_WRITER_H_

#include <string>

extern "C" {
struct _xmlBuffer;
struct _xmlTextWriter;
}

// XmlWriter is a wrapper class around libxml's xmlWriter,
// providing a simplified C++ API.
// StartWriting must be called before other methods, and StopWriting
// must be called before GetWrittenString() will return results.
class XmlWriter {
 public:
  XmlWriter();
  ~XmlWriter();

  // Allocates the xmlTextWriter and an xmlBuffer and starts an XML document.
  // This must be called before any other functions. By default, indenting is
  // set to true.
  void StartWriting();

  // Ends the XML document and frees the xmlTextWriter.
  // This must be called before GetWrittenString() is called.
  void StopWriting();

  // Wrappers around libxml functions -----------------------------------------

  // All following elements will be indented to match their depth.
  void StartIndenting();

  // All follow elements will not be indented.
  void StopIndenting();

  // Start an element with the given name. All future elements added will be
  // children of this element, until it is ended. Returns false on error.
  bool StartElement(const std::string& element_name);

  // Ends the current open element. Returns false on error.
  bool EndElement();

  // Appends to the content of the current open element.
  bool AppendElementContent(const std::string& content);

  // Adds an attribute to the current open element. Returns false on error.
  bool AddAttribute(const std::string& attribute_name,
                    const std::string& attribute_value);

  // Adds a new element with name |element_name| and content |content|
  // to the buffer. Example: <|element_name|>|content|</|element_name|>
  // Returns false on errors.
  bool WriteElement(const std::string& element_name,
                    const std::string& content);

  // Helper functions not provided by xmlTextWriter ---------------------------

  // Returns the string that has been written to the buffer.
  std::string GetWrittenString();

 private:
  // The underlying libxml xmlTextWriter.
  _xmlTextWriter* writer_;

  // Stores the output.
  _xmlBuffer* buffer_;
};

#endif  // THIRD_PARTY_LIBXML_CHROMIUM_XML_WRITER_H_
