class MSS::Core::Options::XMLSerializer

Given a hash of serialization rules, an XMLSerializer can convert a hash of request options into XML. The request options are validated before returning XML.

Attributes

http[R]

@return [Hash,nil]

namespace[R]

@return [String]

operation_name[R]

@return [String] Returns the name of the API operation.

rules[R]

@return [Hash]

validator[R]

@return [Validator]

Public Class Methods

new(namespace, operation_name, operation) click to toggle source

@param [String] namespace @param [String] operation_name @param [Hash] operation

# File lib/mss/core/options/xml_serializer.rb, line 27
def initialize namespace, operation_name, operation
  @namespace = namespace
  @operation_name = operation_name
  @rules = operation[:inputs]
  @http = operation[:http]
  @validator = Validator.new(rules)
end

Public Instance Methods

serialize(request_options) click to toggle source

@overload serialize!(request_options)

@param [Hash] request_options A hash of already validated
  request options with normalized values.
@return [String] Returns an string of the request parameters
  serialized into XML.
# File lib/mss/core/options/xml_serializer.rb, line 55
def serialize request_options
  if http && http[:request_payload]
    payload = http[:request_payload]
    root_node_name = rules[payload][:name]
    params = request_options[payload]
    rules = self.rules[payload][:members]
  else
    root_node_name = "#{operation_name}Request"
    params = request_options
    rules = self.rules
  end
  xml = Nokogiri::XML::Builder.new
  xml.send(root_node_name, :xmlns => namespace) do |xml|
    hash_members_xml(params, rules, xml)
  end
  xml.doc.root.to_xml
end

Protected Instance Methods

hash_members_xml(hash, rules, builder) click to toggle source
# File lib/mss/core/options/xml_serializer.rb, line 99
def hash_members_xml hash, rules, builder
  xml_ordered_members(rules).each do |member_name|
    if hash.key?(member_name)
      value = hash[member_name]
      to_xml(builder, member_name, rules[member_name], value)
    end
  end
end
to_xml(builder, opt_name, rules, value) click to toggle source
# File lib/mss/core/options/xml_serializer.rb, line 75
def to_xml builder, opt_name, rules, value

  xml_name = rules[:name]
  xml_name ||= opt_name.is_a?(String) ?
    opt_name : Inflection.class_name(opt_name.to_s)

  case value
  when Hash

    builder.send(xml_name) do |builder|
      hash_members_xml(value, rules[:members], builder)
    end

  when Array
    builder.send(xml_name) do
      value.each do |member_value|
        to_xml(builder, 'member', rules[:members], member_value)
      end
    end
  else builder.send(xml_name, value)
  end

end
xml_ordered_members(members) click to toggle source
# File lib/mss/core/options/xml_serializer.rb, line 108
def xml_ordered_members members
  members.inject([]) do |list,(member_name, member)|
    list << [member[:position] || 0, member_name]
  end.sort_by(&:first).map(&:last)
end