class Arbetsformedlingen::API::BaseSOAPClient

Base client for SOAP clients

Attributes

namespace[R]
request[R]
service_url[R]

Public Class Methods

new(url, namespace) click to toggle source

Initialize client

# File lib/arbetsformedlingen/api/base_soap_client.rb, line 13
def initialize(url, namespace)
  @service_url = url
  @namespace = namespace
  @request = SOAPRequest.new(url)
end

Public Instance Methods

client_request(name, args: {}) click to toggle source

Perform client request @param [String] name of the main node @param args [Hash] optional arguments @return [Response]

# File lib/arbetsformedlingen/api/base_soap_client.rb, line 23
      def client_request(name, args: {})
        soap_body = SOAPBuilder.wrap do |body| # rubocop:disable Lint/UnusedBlockArgument
          # HACK: Work around the XMLBuilder DSL
          ruby_statements = args.map do |key, value|
            if value.is_a?(Array)
              inner_ruby_statements = value.map do |(k, v)|
                "inode.#{k}('#{v}')"
              end

              <<~RUBY_EVAL
                node.#{key} { |inode| #{inner_ruby_statements.join(';')} }
              RUBY_EVAL
            else
              "node.#{key}('#{value}')"
            end
          end

          ruby_xml_builder_code = <<~RUBY_EVAL
            body.#{name}(xmlns: namespace) { |node| #{ruby_statements.join(';')} }
          RUBY_EVAL

          instance_eval(ruby_xml_builder_code)
        end

        request.post(soap_body.to_xml)
      end