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 }