on 9c8dfd9 help sign in
79 lines 2.1 kB history raw
2Elm.Native.Json = function(elm) {
3 'use strict';
5 var Maybe = Elm.Maybe(elm);
6 var Dict = Elm.Dict(elm);
7 var List = Elm.List(elm);
8 var JS = Elm.JavaScript(elm);
10 function fromValue(v) {
11 switch (v.ctor) {
12 case 'Null' : return null;
13 case 'String' : return JS.fromString(v._0);
14 case 'Object' :
15 var obj = {};
16 var array = JS.fromList(Dict.toList(v._0));
17 for (var i = arr.length; i--; ) {
18 obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);
19 }
20 return obj;
21 case 'Array' :
22 var array = JS.fromList(v._0);
23 for (var i = array.length; i--; ) {
24 array[i] = fromValue(array[i]);
25 }
26 return array;
27 default :
28 return v._0;
29 }
30 }
32 function toPrettyJSString(sep, obj) {
33 return JSON.stringify(fromValue(obj), null, JS.fromString(sep));
34 }
36 function toValue(v) {
37 switch (typeof v) {
38 case 'string' : return { ctor:"String", _0: JS.toString(v) };
39 case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };
40 case 'boolean': return { ctor:"Bool" , _0: JS.toBool(v) };
41 case 'object' :
42 if (v === null) return { ctor:"Null" };
43 if (v instanceof Array) {
44 for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }
45 return { ctor:"Array", _0: JS.toList(v) };
46 }
47 var array = [];
48 for (var k in v) array.push(Tuple2(JS.toString(k), toValue(v[k])));
49 return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };
50 }
51 }
53 function fromJSString(str) {
54 try {
55 return Maybe.Just(toValue(JSON.parse(str)));
56 } catch (e) {
57 return Maybe.Nothing;
58 }
59 }
61 function recordFromJSString(str) {
62 try {
63 return Maybe.Just(JS.toRecord(JSON.parse(str)));
64 } catch (e) {
65 return Maybe.Nothing;
66 }
67 }
68 function recordToPrettyJSString(sep, rec) {
69 return JSON.stringify(JS.fromRecord(rec), null, JS.fromString(sep));
70 }
72 return elm.Native.Json = {
73 toPrettyJSString : F2(toPrettyJSString),
74 fromJSString : fromJSString,
75 recordToPrettyJSString : F2(recordToPrettyJSString),
76 recordFromJSString : recordFromJSString
77 };
79};