on 63243ca help sign in
72 lines 2.0 kB history raw
1Elm.Native.Json = {};
2Elm.Native.Json.make = function(elm) {
4 elm.Native = elm.Native || {};
5 elm.Native.Json = elm.Native.Json || {};
6 if (elm.Native.Json.values) return elm.Native.Json.values;
8 var Maybe = Elm.Maybe.make(elm);
9 var Dict = Elm.Dict.make(elm);
10 var List = Elm.List.make(elm);
11 var JS = Elm.JavaScript.make(elm);
12 var Utils = Elm.Native.Utils.make(elm);
14 function fromValue(v) {
15 switch (v.ctor) {
16 case 'Null' : return null;
17 case 'String' : return JS.fromString(v._0);
18 case 'Object' :
19 var obj = {};
20 var array = JS.fromList(Dict.toList(v._0));
21 for (var i = array.length; i--; ) {
22 obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);
23 }
24 return obj;
25 case 'Array' :
26 var array = JS.fromList(v._0);
27 for (var i = array.length; i--; ) {
28 array[i] = fromValue(array[i]);
29 }
30 return array;
31 default :
32 return v._0;
33 }
34 }
36 function toPrettyJSString(sep, obj) {
37 return JSON.stringify(fromValue(obj), null, JS.fromString(sep));
38 }
40 function toValue(v) {
41 switch (typeof v) {
42 case 'string' : return { ctor:"String", _0: JS.toString(v) };
43 case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };
44 case 'boolean': return { ctor:"Boolean" , _0: JS.toBool(v) };
45 case 'object' :
46 if (v === null) return { ctor:"Null" };
47 if (v instanceof Array) {
48 for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }
49 return { ctor:"Array", _0: JS.toList(v) };
50 }
51 var array = [];
52 for (var k in v) array.push(Utils.Tuple2(JS.toString(k), toValue(v[k])));
53 return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };
54 }
55 }
57 function fromJSString(str) {
58 try {
59 return Maybe.Just(toValue(JSON.parse(str)));
60 } catch (e) {
61 return Maybe.Nothing;
62 }
63 }
65 return elm.Native.Json.values = {
66 toJSString : F2(toPrettyJSString),
67 fromJSString : fromJSString,
68 toJSObject : fromValue,
69 fromJSObject : toValue
70 };
72};