#ifndef DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SERIALIZER_H_ // NOLINT
#define DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SERIALIZER_H_ // NOLINT
#include <memory>
#include <string>
#include <vector>
#include "base/port.h"
namespace dynamic_depth {
namespace xmpmeta {
namespace xml {
// Serializes properties for a hierarchy of objects.
// Example:
// BookSerializer serializer();
// // Serialize a list of objects.
// std::unique_ptr<Serializer> book_list_serializer =
// serializer->CreateListSerializer("Books");
// for (Book *book : book_list) {
// std::unique_ptr<Serializer> book_serializer =
// cameras_serializer->CreateItemSerializer("Book");
// success &= book->Serialize(book_serializer.get());
//
// // Write properties in an object.
// // This would be called from the Book class.
// string book_name("Book");
// std::unique_ptr<Serializer> book_info_serializer =
// book_serializer->CreateSerializer("Info");
// book_info_serializer->WriteProperty("Author", "Cereal Eyser");
// book_info_serializer->WriteProperty("ISBN", "314159265359");
// std::unique_ptr<Serializer> genre_serializer =
// book_serializer->CreateSeralizer("Genre", true);
// std::unique_ptr<Serializer> fantasy_serializer =
// genre_serializer->CreateSerialzer("Fantasy");
// // Serialize genre properties here.
// }
class Serializer {
public:
virtual ~Serializer() {}
// Returns a Serializer for an object that is an item in a list.
virtual std::unique_ptr<Serializer> CreateItemSerializer(
const string& prefix, const string& item_name) const = 0;
// Returns a Serializer for a list of objects.
virtual std::unique_ptr<Serializer> CreateListSerializer(
const string& prefix, const string& list_name) const = 0;
// Creates a serializer from the current serializer.
// node_ns_name is the XML namespace to which the newly created node belongs.
// If this parameter is an empty string, the new node will not belong to a
// namespace.
// node_name is the name of the new node. This parameter cannot be an empty
// string.
virtual std::unique_ptr<Serializer> CreateSerializer(
const string& node_ns_name, const string& node_name) const = 0;
// Serializes a property with the given prefix.
// Example: <NodeName PropertyPrefix:PropertyName="PropertyValue" />
virtual bool WriteBoolProperty(const string& prefix, const string& name,
bool value) const = 0;
virtual bool WriteProperty(const string& prefix, const string& name,
const string& value) const = 0;
// Serializes the collection of values.
virtual bool WriteIntArray(const string& prefix, const string& array_name,
const std::vector<int>& values) const = 0;
virtual bool WriteDoubleArray(const string& prefix, const string& array_name,
const std::vector<double>& values) const = 0;
};
} // namespace xml
} // namespace xmpmeta
} // namespace dynamic_depth
#endif // DYNAMIC_DEPTH_INTERNAL_XMPMETA_XML_SERIALIZER_H_ // NOLINT