72 lines
2 KiB
JavaScript
72 lines
2 KiB
JavaScript
Elm.Native.Json = {};
|
|
Elm.Native.Json.make = function(elm) {
|
|
|
|
elm.Native = elm.Native || {};
|
|
elm.Native.Json = elm.Native.Json || {};
|
|
if (elm.Native.Json.values) return elm.Native.Json.values;
|
|
|
|
var Maybe = Elm.Maybe.make(elm);
|
|
var Dict = Elm.Dict.make(elm);
|
|
var List = Elm.List.make(elm);
|
|
var JS = Elm.JavaScript.make(elm);
|
|
var Utils = Elm.Native.Utils.make(elm);
|
|
|
|
function fromValue(v) {
|
|
switch (v.ctor) {
|
|
case 'Null' : return null;
|
|
case 'String' : return JS.fromString(v._0);
|
|
case 'Object' :
|
|
var obj = {};
|
|
var array = JS.fromList(Dict.toList(v._0));
|
|
for (var i = array.length; i--; ) {
|
|
obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);
|
|
}
|
|
return obj;
|
|
case 'Array' :
|
|
var array = JS.fromList(v._0);
|
|
for (var i = array.length; i--; ) {
|
|
array[i] = fromValue(array[i]);
|
|
}
|
|
return array;
|
|
default :
|
|
return v._0;
|
|
}
|
|
}
|
|
|
|
function toPrettyJSString(sep, obj) {
|
|
return JSON.stringify(fromValue(obj), null, JS.fromString(sep));
|
|
}
|
|
|
|
function toValue(v) {
|
|
switch (typeof v) {
|
|
case 'string' : return { ctor:"String", _0: JS.toString(v) };
|
|
case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };
|
|
case 'boolean': return { ctor:"Boolean" , _0: JS.toBool(v) };
|
|
case 'object' :
|
|
if (v === null) return { ctor:"Null" };
|
|
if (v instanceof Array) {
|
|
for (var i = v.length; i--; ) { v[i] = toValue(v[i]); }
|
|
return { ctor:"Array", _0: JS.toList(v) };
|
|
}
|
|
var array = [];
|
|
for (var k in v) array.push(Utils.Tuple2(JS.toString(k), toValue(v[k])));
|
|
return { ctor:"Object", _0: Dict.fromList(JS.toList(array)) };
|
|
}
|
|
}
|
|
|
|
function fromJSString(str) {
|
|
try {
|
|
return Maybe.Just(toValue(JSON.parse(str)));
|
|
} catch (e) {
|
|
return Maybe.Nothing;
|
|
}
|
|
}
|
|
|
|
return elm.Native.Json.values = {
|
|
toJSString : F2(toPrettyJSString),
|
|
fromJSString : fromJSString,
|
|
toJSObject : fromValue,
|
|
fromJSObject : toValue
|
|
};
|
|
|
|
};
|