1 module uim.json.classes.object_; 2 3 import std.stdio; 4 import std..string; 5 import std.traits; 6 import uim.json; 7 8 class DJSNObject : DJSNValue { 9 private: 10 DJSNValue[string] _values; 11 12 public: 13 this() { } 14 this(DJSNObject value) { this.values = value.values; } 15 this(DJSNValue[string] values) { this.values = values; } 16 this(bool[string] values) { this.values = values; } 17 this(double[string] values) { this.values = values; } 18 this(string[string] values) { this.values = values; } 19 20 @property auto fields() { return _values.keys; } 21 22 @property auto values() { return _values; } 23 @property void values(DJSNValue[string] values) { foreach(k, v; values) _values[k] = v.dup; } 24 @property void values(T)(T[string] values) { foreach(k, v; values) _values[k] = JSNValue(v); } 25 @property override size_t length() { return 1; } 26 27 void opCall(DJSNObject value) { this.values = value.values; } 28 void opCall(DJSNValue[string] values) { this.values = values; } 29 void opCall(string[string] values) { this.values = values; } 30 31 //alias opIndexAssign = super.opIndexAssign; 32 O opIndexAssign(this O, T)(T value, string name) if ((isNarrowString!T) && (isArray!T)) { _values[name] = JSNString(value); return cast(O)this; } 33 O opIndexAssign(this O, T)(T value, string name) if ((!isNarrowString!T) && (!isArray!T)) { 34 // writeln("override void opIndexAssign(T)(T value, string name)"); 35 // writeln("Before... ", values); 36 _values[name] = JSNValue(value); 37 // writeln("After... ", values); 38 return cast(O)this; 39 } 40 O opIndexAssign(this O, T)(T values, string name) if ((!isNarrowString!T) && (isArray!T)) { _values[name] = JSNArray(values); return cast(O)this; } 41 42 O opIndexAssign(this O, T)(T value, size_t index) if ((isNarrowString!T) && (isArray!T)) { if (index < length) _values[_values.keys[index]] = JSNString(value); return cast(O)this; } 43 O opIndexAssign(this O, T)(T value, size_t index) if ((!isNarrowString!T) && (!isArray!T)) { 44 writeln("override void opIndexAssign(T)(T value, string name)"); 45 writeln("Before... ", values); 46 if (index < length) _values[_values.keys[index]] = JSNValue(value); 47 writeln("After... ", values); 48 return cast(O)this; 49 } 50 O opIndexAssign(this O, T)(T values, size_t index) if ((!isNarrowString!T) && (isArray!T)) { if (index < length) _values[_values.keys[index]] = JSNArray(values); return cast(O)this; } 51 52 override DJSNValue opIndex(string name) { if (name in values) return values[name]; return null; } 53 override DJSNValue opIndex(size_t index) { if (index < length) return this[fields[index]]; return null; } 54 55 DJSNValue remove(string name) { 56 if (auto result = this[name]) { 57 _values.remove(name); return result; 58 } 59 return null; 60 } 61 auto clear() { _values.clear; return this; } 62 63 override DJSNValue dup() { return JSNObject(values); } 64 65 // void fromString(string jsonString) { 66 // auto str = jsonString.strip; 67 // if (str.empty) return; 68 // if (!str.startsWith("{")) return; 69 // if (!str.endsWith("}")) return; 70 // 71 // auto innerStr = str[1..$-1].strip; 72 // if (innerStr.empty) return; 73 // 74 // string fieldName = readNextFieldName(innerStr); 75 // } 76 override string toString() { 77 import std..string; 78 79 string[] strings; 80 foreach(k, v; values) strings ~= `"%s" : %s`.format(k, v.toString); 81 return `{ %s }`.format(strings.join(", ")); 82 } 83 } 84 auto JSNObject() { return new DJSNObject(); } 85 auto JSNObject(DJSNObject value) { return new DJSNObject(value); } 86 auto JSNObject(DJSNValue[string] values) { return new DJSNObject(values); } 87 auto JSNObject(string[string] values) { return new DJSNObject(values); } 88 auto JSNObject(bool[string] values) { return new DJSNObject(values); } 89 auto JSNObject(double[string] values) { return new DJSNObject(values); } 90 91 auto JSNObject(string text) { 92 auto txt = strip(text); 93 if (txt[0] != '{') return null; 94 if (txt[$-1] != '}') return null; 95 96 return JSNObject(text); 97 } 98