// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DOM_SERIALIZER_H_
#define COBALT_DOM_SERIALIZER_H_

#include <iosfwd>

#include "cobalt/dom/node.h"

namespace cobalt {
namespace dom {

// This class is responsible for serializing nodes into the provided output
// stream. Note that in the serialization result, the attributes are sorted
// alphabetically, each tag has both opening and closing tag.
class Serializer : public ConstNodeVisitor {
 public:
  explicit Serializer(std::ostream* out_stream);

  // Serializes the provided node and its descendants.
  void Serialize(const scoped_refptr<const Node>& node);
  // Serializes the provided node, excluding the descendants.
  void SerializeSelfOnly(const scoped_refptr<const Node>& node);
  // Serializes the descendants of the provided node, excluding the node itself.
  void SerializeDescendantsOnly(const scoped_refptr<const Node>& node);

 private:
  // From ConstNodeVisitor.
  void Visit(const CDATASection* cdata_section) OVERRIDE;
  void Visit(const Comment* comment) OVERRIDE;
  void Visit(const Document* document) OVERRIDE;
  void Visit(const DocumentType* document_type) OVERRIDE;
  void Visit(const Element* element) OVERRIDE;
  void Visit(const Text* text) OVERRIDE;

  // Pointer to the output stream provided by the user.
  std::ostream* out_stream_;
  // Used by the Visit methods. True when Visit is called when entering a Node,
  // false when leaving.
  bool entering_node_;

  DISALLOW_COPY_AND_ASSIGN(Serializer);
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_SERIALIZER_H_
