Sha256: 404ca8f7e3d7b685a577f47f247fe659c05c0e7250fcac826db1981ea8a0765e

Contents?: true

Size: 1.1 KB

Versions: 1

Compression:

Stored size: 1.1 KB

Contents

module APIClientBase
  module Client
    module ClassMethods

      def api_action(action_name, opts={})
        define_method action_name do |args={}|
          namespace = self.class.name.deconstantize.constantize

          request_class_name = [action_name.to_s.camelize, "Request"].join
          request_class = namespace.const_get(request_class_name)

          response_class_name = [action_name.to_s.camelize, "Response"].join
          response_class = namespace.const_get(response_class_name)

          if opts[:args].is_a?(Array)
            request_args = opts[:args].each_with_object({}).
              with_index { |(arg, hash), i| hash[arg] = args[i] }
          else
            request_args = args
          end

          default_request_opts_method =
            self.class.api_client_base_client_options[:default_opts]
          default_request_opts = send(default_request_opts_method)

          request = request_class.new(default_request_opts.merge(request_args))
          raw_response = request.()
          response_class.new(raw_response: raw_response)
        end
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
api_client_base-0.2.0 lib/api_client_base/client/class_methods.rb