class Aws::Xml::Builder

Public Class Methods

new(rules, options = {}) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 9
def initialize(rules, options = {})
  @rules = rules
  @xml = options[:target] || []
  indent = options[:indent] || '  '
  pad = options[:pad] || ''
  @builder = DocBuilder.new(target:@xml, indent:indent, pad:pad)
end

Public Instance Methods

serialize(params)
Alias for: to_xml
to_xml(params) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 17
def to_xml(params)
  structure(@rules.location_name, @rules, params)
  @xml.join
end
Also aliased as: serialize

Private Instance Methods

blob(value) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 88
def blob(value)
  value = value.read unless String === value
  Base64.strict_encode64(value)
end
list(name, ref, values) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 48
def list(name, ref, values)
  if ref['flattened']
    values.each do |value|
      member(ref.shape.member.location_name || name, ref.shape.member, value)
    end
  else
    node(name, ref) do
      values.each do |value|
        mname = ref.shape.member.location_name || 'member'
        member(mname, ref.shape.member, value)
      end
    end
  end
end
map(name, ref, hash) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 63
def map(name, ref, hash)
  key_ref = ref.shape.key
  value_ref = ref.shape.value
  node(name, ref) do
    hash.each do |key, value|
      node('entry', ref)  do
        member(key_ref.location_name || 'key', key_ref, key)
        member(value_ref.location_name || 'value', value_ref, value)
      end
    end
  end
end
member(name, ref, value) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 76
def member(name, ref, value)
  case ref.shape
  when StructureShape then structure(name, ref, value)
  when ListShape      then list(name, ref, value)
  when MapShape       then map(name, ref, value)
  when TimestampShape then node(name, ref, timestamp(value))
  when BlobShape      then node(name, ref, blob(value))
  else
    node(name, ref, value.to_s)
  end
end
node(name, ref, *args, &block) click to toggle source

The `args` list may contain:

* [] - empty, no value or attributes
* [value] - inline element, no attributes
* [value, attributes_hash] - inline element with attributes
* [attributes_hash] - self closing element with attributes

Pass a block if you want to nest XML nodes inside. When doing this, you may not pass a value to the `args` list.

# File lib/aws-sdk-core/xml/builder.rb, line 107
def node(name, ref, *args, &block)
  attrs = args.last.is_a?(Hash) ? args.pop : {}
  attrs = shape_attrs(ref).merge(attrs)
  args << attrs
  @builder.node(name, *args, &block)
end
shape_attrs(ref) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 114
def shape_attrs(ref)
  if xmlns = ref['xmlNamespace']
    if prefix = xmlns['prefix']
      { 'xmlns:' + prefix => xmlns['uri'] }
    else
      { 'xmlns' => xmlns['uri'] }
    end
  else
    {}
  end
end
structure(name, ref, values) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 25
def structure(name, ref, values)
  if values.empty?
    node(name, ref)
  else
    node(name, ref, structure_attrs(ref, values)) do
      ref.shape.members.each do |member_name, member_ref|
        next if values[member_name].nil?
        next if xml_attribute?(member_ref)
        member(member_ref.location_name, member_ref, values[member_name])
      end
    end
  end
end
structure_attrs(ref, values) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 39
def structure_attrs(ref, values)
  ref.shape.members.inject({}) do |attrs, (member_name, member_ref)|
    if xml_attribute?(member_ref) && values.key?(member_name)
      attrs[member_ref.location_name] = values[member_name]
    end
    attrs
  end
end
timestamp(value) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 93
def timestamp(value)
  value.utc.iso8601
end
xml_attribute?(ref) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 126
def xml_attribute?(ref)
  !!ref['xmlAttribute']
end