class Aws::Xml::Builder

Public Class Methods

new(shape) click to toggle source

@param [Seahorse::Model::Shapes::Structure] shape

# File lib/aws-sdk-core/xml/builder.rb, line 9
def initialize(shape)
  @shape = shape
  @xml = []
  @builder = ::Builder::XmlMarkup.new(target: @xml, indent: 2)
end

Public Instance Methods

to_xml(params) click to toggle source

@param [Hash] params @return [String] Returns an XML doc string.

# File lib/aws-sdk-core/xml/builder.rb, line 17
def to_xml(params)
  structure(@shape.location_name, @shape, params)
  @xml.join
end

Private Instance Methods

flat?(shape) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 120
def flat?(shape)
  shape.metadata('flattened')
end
list(name, shape, values) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 49
def list(name, shape, values)
  if flat?(shape)
    values.each do |value|
      member(name, shape.member, value)
    end
  else
    node(name, shape) do
      values.each do |value|
        mname = shape.member.location_name || 'member'
        member(mname, shape.member, value)
      end
    end
  end
end
map(name, shape, hash) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 64
def map(name, shape, hash)
  node(name, shape) do
    hash.each do |key, value|
      node('entry', shape)  do
        member(shape.key.location_name || 'key', shape.key, key)
        member(shape.value.location_name || 'value', shape.value, value)
      end
    end
  end
end
member(name, shape, value) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 75
def member(name, shape, value)
  case shape.type
  when 'structure' then structure(name, shape, value)
  when 'list'      then list(name, shape, value)
  when 'timestamp' then node(name, shape, shape.format_time(value, 'iso8601'))
  when 'blob'      then node(name, shape, Base64.strict_encode64(value.read))
  when 'map'       then map(name, shape, value)
  else
    node(name, shape, value.to_s)
  end
end
node(name, shape, *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 97
def node(name, shape, *args, &block)
  attrs = args.last.is_a?(Hash) ? args.pop : {}
  attrs = shape_attrs(shape).merge(attrs)
  args << attrs
  @builder.__send__(name, *args, &block)
end
shape_attrs(shape) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 104
def shape_attrs(shape)
  if xmlns = shape.metadata('xmlNamespace')
    if prefix = xmlns['prefix']
      { 'xmlns:' + prefix => xmlns['uri'] }
    else
      { 'xmlns' => xmlns['uri'] }
    end
  else
    {}
  end
end
structure(name, shape, values) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 24
def structure(name, shape, values)
  if values.empty?
    node(name, shape)
  else
    node(name, shape, structure_attrs(shape, values)) do
      shape.members.each do |member_name, member_shape|
        unless values[member_name].nil?
          next if xml_attribute?(member_shape)
          mname = member_shape.location_name || member_name.to_s
          member(mname, member_shape, values[member_name])
        end
      end
    end
  end
end
structure_attrs(shape, values) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 40
def structure_attrs(shape, values)
  shape.members.inject({}) do |attrs, (member_name, member_shape)|
    if xml_attribute?(member_shape) && values.key?(member_name)
      attrs[member_shape.location_name] = values[member_name]
    end
    attrs
  end
end
xml_attribute?(shape) click to toggle source
# File lib/aws-sdk-core/xml/builder.rb, line 116
def xml_attribute?(shape)
  !!shape.metadata('xmlAttribute')
end