decko-commons/decko

View on GitHub
card/lib/card/env/success.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
92%
class Card
  module Env
    # Success objects
    class Success
      include Location
      include Target

      attr_accessor :name, :name_context, :reload
      attr_writer :params, :redirect, :card
      attr_reader :id

      def initialize name_context=nil, success_args=nil
        @name_context = name_context
        @new_args = {}
        @params = OpenStruct.new
        self << normalize_success_args(success_args)
      end

      def to_url name_context=@name_context
        target = target name_context
        target.is_a?(Card) ? target.format.path(params) : target
      end

      def in_context name_context
        self.name_context = name_context
        self
      end

      def << value
        if value.is_a? Hash
          apply value
        else
          self.mark = value
        end
      end

      def redirect
        @redirect.present? ? @redirect : false
      end

      def reload?
        @reload.to_s == "true"
      end

      def []= key, value
        if respond_to? "#{key}="
          send "#{key}=", value
        else
          @params.send "#{key}=", value
        end
      end

      def [] key
        if respond_to? key.to_sym
          send key.to_sym
        else
          @params.send key.to_sym
        end
      end

      def flash message=nil
        @params[:flash] ||= []
        @params[:flash] << message if message
        @params[:flash]
      end

      def params
        @params.marshal_dump
      end

      def session
        Card::Env.session
      end

      private

      def respond_to_missing? method, _include_private=false
        method.match?(/^(\w+)=?$/) || super
      end

      def method_missing method, *args
        return super unless (m = method.match(/^(\w+(=)?)/))

        infer_bracket m[1].to_sym, m[2], args[0]
      end

      def infer_bracket method, assign, val
        args = [method]
        args << val if assign
        @params.send(*args)
      end

      def apply hash
        hash.each_pair do |key, value|
          next unless value.present?

          self[key] = value
        end
      end

      def normalize_success_args success_args
        case success_args
        when nil
          self.mark = "_self"
          {}
        when ActionController::Parameters
          success_args.to_unsafe_h
        else
          success_args
        end
      end
    end
  end
end