module plist.types.element;
public import plist.exceptions;
public import dxml.dom;
public import dxml.writer;
public import std.range : Appender;

struct PlistKey {
    string key;
}

enum PlistOptional;

enum PlistElementType {
  PLIST_ELEMENT_DATA = "data",
  PLIST_ELEMENT_STRING = "string",
  PLIST_ELEMENT_BOOLEAN_TRUE = "true",
  PLIST_ELEMENT_BOOLEAN_FALSE = "false",
  PLIST_ELEMENT_DATE = "date",
  PLIST_ELEMENT_INTEGER = "integer",
  PLIST_ELEMENT_REAL = "real",
  PLIST_ELEMENT_ARRAY = "array",
  PLIST_ELEMENT_DICT = "dict",
  PLIST_ELEMENT_KEY = "key"
}

interface PlistElement {
    // everything is subclassed from this
    void instantiate(DOMEntity!(string) entity);
    string toString(); //expected override
    void write(ref XMLWriter!(Appender!string) writer);
    string type();
}