lib/zuora/utils/envelope.rb in zuora-ruby-0.4.0 vs lib/zuora/utils/envelope.rb in zuora-ruby-0.5.0

- old
+ new

@@ -6,16 +6,12 @@ # @param [Callable] header - optional function of builder, rtns builder # @param [Callable] body - optional function of builder, rtns builder def self.xml(header, body) Nokogiri::XML::Builder.new do |builder| builder[:soapenv].Envelope(Zuora::NAMESPACES) do - builder[:soapenv].Header do - header.call builder - end if header - builder[:soapenv].Body do - body.call builder - end if body + builder[:soapenv].Header { header.call builder } if header + builder[:soapenv].Body { body.call builder } if body end end end # Takes a body, and returns an envelope with session token merged in @@ -24,27 +20,52 @@ def self.authenticated_xml(token, &body) failure_message = 'Session token not set. Did you call authenticate?' fail failure_message unless token.present? header = lambda do |builder| - builder[:api].SessionHeader do - builder[:api].session(token) - end + builder[:api].SessionHeader { builder[:api].session(token) } builder end xml(header, body) end - # Builds multiple fields + # Builds one field using key and value. Treats value differently: + # - Hash: recursively builds fields + # - ZObject: builds a nested z object, building fields inside + # - Nil: does nothing + # - Else: builds the field node # @param [Nokogiri::XML::Builder] builder # @param [Symbol] namespace + # @param [Hash] key + # @param [Hash|Zuora::Soap::ZObject|NilClass|Object] value + # @return nil + def self.build_field(builder, namespace, key, value) + zuora_field_name = to_zuora_key(key) + build_fields_thunk = -> { build_fields builder, namespace, value } + case value + when Hash + builder[namespace].send(zuora_field_name) { build_fields_thunk[] } + when Zuora::Soap::ZObject + zuora_type = to_zuora_key(value.type) + xsi = { 'xsi:type' => "obj:#{zuora_type}" } + builder[:api].send(zuora_field_name) do + builder[:api].send(zuora_type, xsi) { build_fields_thunk[] } + end + when NilClass + else + builder[namespace].send(zuora_field_name, value) + end + end + + # Builds multiple fields in given object + # @param [Nokogiri::XML::Builder] builder + # @param [Symbol] namespace # @param [Hash] object # @return nil def self.build_fields(builder, namespace, object = {}) object.each do |key, value| - zuora_field_name = to_zuora_key(key) - builder[namespace].send(zuora_field_name, value) unless value.nil? + build_field builder, namespace, key, value end end # Builds multiple objects # @param [Nokogiri::XML::Builder] builder