1 module plist.types.array;
2 import plist.types.element;
3 import plist.conv;
4 
5 class PlistElementArray : PlistElement {
6     void instantiate(DOMEntity!string entity) {
7         _entity = entity;
8         if(entity.type == EntityType.elementEmpty) return;
9         auto children = entity.children;
10         foreach (child; children) {
11             if (!validateDataType(child))
12                 throw new PlistParsingException("Invalid data type within array\n");
13             auto val = coerceRuntime(cast(PlistElementType)child.name, child);
14             _entries ~= val;
15         }
16     }
17 
18     @property PlistElement[] entries() {
19         return _entries;
20     }
21 
22     @property size_t length() {
23         return _entries.length;
24     }
25 
26     ref PlistElement opIndex(size_t index) {
27         return _entries[index];
28     }
29     
30     void opOpAssign(string op : "~", U)(U val) 
31     if(__traits(compiles, _entries ~= val)) {
32         _entries ~= val;
33     }
34 
35     override string toString() {
36         import std.format : format;
37         return format!"<PlistElementArray n_entries: %d>"(_entries.length);
38     }
39 
40     string type() {
41         return PlistElementType.PLIST_ELEMENT_ARRAY;
42     }
43 
44     void write(ref XMLWriter!(Appender!string) writer) {
45         writer.openStartTag(type());
46         if (_entries.length == 0) { 
47             writer.closeStartTag(EmptyTag.yes);
48         } else {
49             writer.closeStartTag();
50             foreach (entry; _entries) {
51                 entry.write(writer);
52             }
53             writer.writeEndTag(type());
54         }
55     }
56 
57     private {
58         DOMEntity!string _entity;
59         PlistElement[] _entries;
60     }
61 }