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