on c19ccfe help sign in
69 lines 1.8 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);
9 var Utils = Elm.Native.Utils(elm);
11 function fromValue(v) {
12 switch (v.ctor) {
13 case 'Null' : return null;
14 case 'String' : return JS.fromString(v._0);
15 case 'Object' :
16 var obj = {};
17 var array = JS.fromList(Dict.toList(v._0));
18 for (var i = array.length; i--; ) {
19 obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);
20 }
21 return obj;
22 case 'Array' :
23 var array = JS.fromList(v._0);
24 for (var i = array.length; i--; ) {
25 array[i] = fromValue(array[i]);
26 }
27 return array;
28 default :
29 return v._0;
30 }
31 }
33 function toPrettyJSString(sep, obj) {
34 return JSON.stringify(fromValue(obj), null, JS.fromString(sep));
35 }
37 function toValue(v) {
38 switch (typeof v) {
39 case 'string' : return { ctor:"String", _0: JS.toString(v) };
40 case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };
41 case 'boolean': return { ctor:"Bool" , _0: JS.toBool(v) };
42 case 'object' :
43 if (v === null) return { ctor:"Null" };
44 if (v instanceof Array) {
45 for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }
46 return { ctor:"Array", _0: JS.toList(v) };
47 }
48 var array = [];
49 for (var k in v) array.push(Utils.Tuple2(JS.toString(k), toValue(v[k])));
50 return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };
51 }
52 }
54 function fromJSString(str) {
55 try {
56 return Maybe.Just(toValue(JSON.parse(str)));
57 } catch (e) {
58 return Maybe.Nothing;
59 }
60 }
62 return elm.Native.Json = {
63 toJSString : F2(toPrettyJSString),
64 fromJSString : fromJSString,
65 toJSObject : fromValue,
66 fromJSObject : toValue
67 };
69};