mirror of
https://github.com/amark/gun.git
synced 2025-06-11 16:46:43 +00:00
80 lines
2.4 KiB
JavaScript
80 lines
2.4 KiB
JavaScript
var AWS = require('../core');
|
|
var builder = require('xmlbuilder');
|
|
var inherit = AWS.util.inherit;
|
|
|
|
/**
|
|
* @api private
|
|
*/
|
|
AWS.XML.Builder = inherit({
|
|
|
|
constructor: function XMLBuilder(root, rules, options) {
|
|
this.root = root;
|
|
this.rules = rules;
|
|
this.xmlns = options.xmlnamespace;
|
|
this.timestampFormat = options.timestampFormat;
|
|
},
|
|
|
|
toXML: function toXML(params) {
|
|
var xml = builder.create(this.root);
|
|
if (this.xmlns) xml.att('xmlns', this.xmlns);
|
|
this.serializeStructure(this.rules, params, xml);
|
|
return xml.root().toString();
|
|
},
|
|
|
|
serializeStructure: function serializeStructure(rules, params, xml) {
|
|
AWS.util.each.call(this, rules || {}, function (memberName, memberRules) {
|
|
var value = params[memberName];
|
|
if (value !== undefined) {
|
|
if (memberRules.attribute) {
|
|
xml.att(memberRules.name, value);
|
|
} else {
|
|
this.serializeMember(memberName, memberRules, value, xml);
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
serializeList: function serializeList(name, rules, list, xml) {
|
|
if (rules.flattened) {
|
|
AWS.util.arrayEach.call(this, list, function (value) {
|
|
this.serializeMember(rules.name || name, rules.members, value, xml);
|
|
});
|
|
} else {
|
|
xml = xml.ele(rules.name || name);
|
|
AWS.util.arrayEach.call(this, list, function (value) {
|
|
var memberName = rules.members.name || 'member';
|
|
this.serializeMember(memberName, rules.members, value, xml);
|
|
});
|
|
}
|
|
},
|
|
|
|
serializeMember: function serializeMember(memberName, rules, params, xml) {
|
|
if (params === null || params === undefined) return;
|
|
|
|
var name = memberName;
|
|
if (rules.type === 'structure') {
|
|
xml = xml.ele(name);
|
|
this.serializeStructure(rules.members, params, xml);
|
|
} else if (rules.type === 'list') {
|
|
this.serializeList(name, rules, params, xml);
|
|
} else if (rules.type === 'timestamp') {
|
|
var timestampFormat = rules.format || this.timestampFormat;
|
|
var date = AWS.util.date.format(params, timestampFormat);
|
|
xml = xml.ele(name, String(date));
|
|
} else {
|
|
xml = xml.ele(name, String(params));
|
|
}
|
|
this.applyNamespaces(xml, rules);
|
|
},
|
|
|
|
applyNamespaces: function applyNamespaces(xml, rules) {
|
|
if (rules.xmlns) {
|
|
var attr = 'xmlns';
|
|
if (rules.xmlns.prefix) attr += ':' + rules.xmlns.prefix;
|
|
xml.att(attr, rules.xmlns.uri);
|
|
}
|
|
}
|
|
|
|
|
|
});
|