query_param_serializer.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. var util = require('../util');
  2. function QueryParamSerializer() {
  3. }
  4. QueryParamSerializer.prototype.serialize = function(params, shape, fn) {
  5. serializeStructure('', params, shape, fn);
  6. };
  7. function ucfirst(shape) {
  8. if (shape.isQueryName || shape.api.protocol !== 'ec2') {
  9. return shape.name;
  10. } else {
  11. return shape.name[0].toUpperCase() + shape.name.substr(1);
  12. }
  13. }
  14. function serializeStructure(prefix, struct, rules, fn) {
  15. util.each(rules.members, function(name, member) {
  16. var value = struct[name];
  17. if (value === null || value === undefined) return;
  18. var memberName = ucfirst(member);
  19. memberName = prefix ? prefix + '.' + memberName : memberName;
  20. serializeMember(memberName, value, member, fn);
  21. });
  22. }
  23. function serializeMap(name, map, rules, fn) {
  24. var i = 1;
  25. util.each(map, function (key, value) {
  26. var prefix = rules.flattened ? '.' : '.entry.';
  27. var position = prefix + (i++) + '.';
  28. var keyName = position + (rules.key.name || 'key');
  29. var valueName = position + (rules.value.name || 'value');
  30. serializeMember(name + keyName, key, rules.key, fn);
  31. serializeMember(name + valueName, value, rules.value, fn);
  32. });
  33. }
  34. function serializeList(name, list, rules, fn) {
  35. var memberRules = rules.member || {};
  36. if (list.length === 0) {
  37. fn.call(this, name, null);
  38. return;
  39. }
  40. util.arrayEach(list, function (v, n) {
  41. var suffix = '.' + (n + 1);
  42. if (rules.api.protocol === 'ec2') {
  43. // Do nothing for EC2
  44. suffix = suffix + ''; // make linter happy
  45. } else if (rules.flattened) {
  46. if (memberRules.name) {
  47. var parts = name.split('.');
  48. parts.pop();
  49. parts.push(ucfirst(memberRules));
  50. name = parts.join('.');
  51. }
  52. } else {
  53. suffix = '.' + (memberRules.name ? memberRules.name : 'member') + suffix;
  54. }
  55. serializeMember(name + suffix, v, memberRules, fn);
  56. });
  57. }
  58. function serializeMember(name, value, rules, fn) {
  59. if (value === null || value === undefined) return;
  60. if (rules.type === 'structure') {
  61. serializeStructure(name, value, rules, fn);
  62. } else if (rules.type === 'list') {
  63. serializeList(name, value, rules, fn);
  64. } else if (rules.type === 'map') {
  65. serializeMap(name, value, rules, fn);
  66. } else {
  67. fn(name, rules.toWireFormat(value).toString());
  68. }
  69. }
  70. /**
  71. * @api private
  72. */
  73. module.exports = QueryParamSerializer;