2014-04-01 00:47:41 -06:00

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;
}
}
});