Sha256: 0b43095c684359fbfb9077d8822feedbdc3c7be207d976cb94d3fbaa337fe98c

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

module Rad
  module Processors    
    class RemoteCaller < Processor
      # TODO2 :remote isn't registered with rad[
      inject remote: :remote
      
      def initialize next_processor, result_variable = 'content'
        super(next_processor)
        @result_variable = result_variable
      end
      
      def call                
        return next_processor.call unless workspace.class?
                
        # prepare
        klass = workspace.class
        raise "The remote class #{klass} must be a Rad::Remote!" unless klass.is? Rad::Remote
        workspace.remote_object = klass.new                  
        method = workspace.method_name

        # call
        begin
          result = workspace.remote_object.run_callbacks :action, method: method do
            workspace.remote_object.send method
          end
      
          ensure_correct_result! result
          workspace.remote_result = result                        

          next_processor.call
  
          # write JSON as a result if format is JSON and no one else filled it
          if workspace[@result_variable].blank?
            workspace[@result_variable] = workspace.remote_result.to_json
          end              
        rescue StandardError => e
          raise e if !workspace.params.format == 'json' or config.test?
      
          workspace[@result_variable] = {error: e.message}.to_json
  
          logger.error e
          logger.info "\n"
        end
      end
      
      private
        def ensure_correct_result! result
          unless result.rson?
            raise "You can't use object of type '#{result.class}' as Remote's return value!"
          end
        end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rad_core-0.0.13 lib/rad/remote/processors/remote_caller.rb