mirror of
https://github.com/amark/gun.git
synced 2025-06-11 16:46:43 +00:00
77 lines
2.0 KiB
JavaScript
77 lines
2.0 KiB
JavaScript
var AWS = require('../core');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
/**
|
|
* @api private
|
|
*/
|
|
AWS.JSON = {};
|
|
|
|
/**
|
|
* @api private
|
|
*/
|
|
AWS.JSON.Builder = inherit({
|
|
|
|
constructor: function JSONBuilder(rules, options) {
|
|
this.rules = rules;
|
|
this.timestampFormat = options.timestampFormat;
|
|
},
|
|
|
|
build: function build(params) {
|
|
return JSON.stringify(this.translate(this.rules, params));
|
|
},
|
|
|
|
translate: function translate(rules, value) {
|
|
if (value === null || value === undefined) return undefined;
|
|
|
|
if (rules.type === 'structure') {
|
|
|
|
// translate structures (hashes with pre-defined keys)
|
|
var struct = {};
|
|
AWS.util.each.call(this, value, function (memberName, memberValue) {
|
|
var memberRules = rules.members[memberName] || {};
|
|
var result = this.translate(memberRules, memberValue);
|
|
if (result !== undefined) struct[memberName] = result;
|
|
});
|
|
return struct;
|
|
|
|
} else if (rules.type === 'list') {
|
|
|
|
// translate each member of the list
|
|
var list = [];
|
|
AWS.util.arrayEach.call(this, value, function (memberValue) {
|
|
var memberRules = rules.members || {};
|
|
var result = this.translate(memberRules, memberValue);
|
|
if (result !== undefined) list.push(result);
|
|
});
|
|
return list;
|
|
|
|
} else if (rules.type === 'map') {
|
|
|
|
// translate maps (hashes with user supplied keys)
|
|
var map = {};
|
|
AWS.util.each.call(this, value, function (memberName, memberValue) {
|
|
var memberRules = rules.members || {};
|
|
var result = this.translate(memberRules, memberValue);
|
|
if (result !== undefined) map[memberName] = result;
|
|
});
|
|
return map;
|
|
|
|
} else if (rules.type === 'timestamp') {
|
|
|
|
var timestampFormat = rules.format || this.timestampFormat;
|
|
return AWS.util.date.format(value, timestampFormat);
|
|
|
|
} else if (rules.type === 'integer') {
|
|
return parseInt(value, 10);
|
|
} else if (rules.type === 'float') {
|
|
return parseFloat(value);
|
|
} else {
|
|
|
|
// all other shapes
|
|
return value;
|
|
|
|
}
|
|
}
|
|
|
|
});
|