module GxG::Support::Library::CommonIOPrepare

Public Instance Methods

process_parameters(*args) click to toggle source
# File lib/gxg/gxg_io.rb, line 769
def process_parameters(*args)
  default_object = nil
  if args[0].is_a?(Hash)
    # GxG style parameters
    raw_params = args[0]
    unless raw_params[:object].is_any?(self.process_params_classes_valid())
      unless raw_params[:file_descriptor].is_any?(self.process_params_classes_valid())
        default_object = self.process_params_default_object((raw_params[:object] || raw_params[:file_descriptor]))
        if default_object
          raw_params[:object] = default_object
        else
          raise ArgumentError, (self.class::process_params_classes_error())
        end
      end
    end
    unless raw_params[:mode].is_a?(Array)
      raise ArgumentError, "you MUST specify an Array of :mode flags (as symbols)"
    end
    raw_params[:mode].to_enum.each do |the_mode_flag|
      unless [:read, :write, :readwrite, :create, :overwrite, :truncate, :append, :text, :binary].include?(the_mode_flag)
        raw_params[:mode].delete(the_mode_flag)
      end
    end
    unless (raw_params[:mode].include?(:binary) || raw_params[:mode].include?(:text))
      raw_params[:mode] << :text
    end
  else
    # standard MRI style parameters
    raw_params = {:mode => []}
    if args[0].is_any?(self.process_params_classes_valid())
      if args[0].is_a?(::Numeric)
        raw_params[:file_descriptor] = args[0].to_i
      else
        raw_params[:object] = args[0]
      end
    else
      default_object = self.process_params_default_object(args[0])
      if default_object
        raw_params[:object] = default_object
      else
        raise ArgumentError, (self.class::process_params_classes_error())
      end
    end
    if args[2].is_a?(Hash)
      if args[2][:mode]
        raw_params[:raw_mode] = args[2][:mode]
      end
      if args[2][:binmode]
        raw_params[:mode] << :binary
      else
        unless raw_params[:mode].index(:text)
          raw_params[:mode] << :text
        end
      end
      extern_encode = nil
      intern_encode = nil
      if args[2][:encoding]
        extern_encode = args[2][:encoding]
        intern_encode = args[2][:encoding]
      end
      if args[2][:external_encoding]
        unless extern_encode
          extern_encode = args[2][:external_encoding]
        end
      end
      if args[2][:internal_encoding]
        unless intern_encode
          intern_encode = args[2][:internal_encoding]
        end
      end
      if extern_encode
        raw_params[:external_encoding] = extern_encode
      end
      if intern_encode
        raw_params[:internal_encoding] = intern_encode
      end
      if args[2][:autoclose]
        raw_params[:autoclose] = args[2][:autoclose]
      end
    end
    if args[1].is_any?(String,Numeric)
      if raw_params[:raw_mode]
        raise ArgumentError, "you specify :mode as: 2nd parameter (String || Numeric) or an option in 3rd parameter Hash, but not in both"
      else
        raw_params[:raw_mode] = args[1]
      end
      if raw_params[:raw_mode].is_a?(String)
        mode_parse = raw_params[:raw_mode].split(":")
        mode_spec = mode_parse[0].numeric_values()
        if mode_spec.is_a?(Hash)
          raw_params[:raw_mode] = mode_spec[:integer]
        else
          raw_params[:raw_mode] = mode_parse[0]
        end
        #
        if mode_parse.size > 1
          extern_encode = mode_parse[1]
          if mode_parse.size > 2
            intern_encode = mode_parse[2]
          else
            intern_encode = nil
          end
        else
          extern_encode = nil
          intern_encode = nil
        end
        # if specified also in options, it is overwritten here by mode inclusion.
        if (extern_encode == intern_encode)
          if extern_encode
            # raw_params[:encoding] = extern_encode
            raw_params[:external_encoding] = extern_encode
            raw_params[:internal_encoding] = extern_encode
          end
        else
          if extern_encode
            raw_params[:external_encoding] = extern_encode
          end
          if intern_encode
            raw_params[:internal_encoding] = intern_encode
          end
        end
        #
      else
        # numeric mode arg
        raw_params[:raw_mode] = args[1].to_i
      end
    end
    #
    unless (raw_params[:object] || raw_params[:file_descriptor])
      raise ArgumentError, "you MUST specify an IO :object or a :file_descriptor Fixnum"
    end
    #
    if raw_params[:raw_mode]
      # decipher :raw_mode
      if raw_params[:raw_mode].is_a?(Numeric)
        # Numeric
        if raw_params[:file_descriptor]
          if (raw_params[:raw_mode] & ::File::RDWR) == ::File::RDWR
            raw_params[:mode] << :read
            raw_params[:mode] << :write
          else
            if (raw_params[:raw_mode] &  ::File::WRONLY) ==  ::File::WRONLY
              raw_params[:mode] << :write
            else
              if (raw_params[:raw_mode] & ::File::RDONLY) == ::File::RDONLY
                raw_params[:mode] << :read
              end
            end
          end
          if (raw_params[:raw_mode] & ::File::TRUNC) == ::File::TRUNC
            raw_params[:mode] << :overwrite
          end
          if (raw_params[:raw_mode] & ::File::APPEND) == ::File::APPEND
            raw_params[:mode] << :append
          end
          if (raw_params[:raw_mode] & ::File::CREAT) == ::File::CREAT
            raw_params[:mode] << :append
          end
        else
          if (raw_params[:raw_mode] & ::IO::RDWR) == ::IO::RDWR
            raw_params[:mode] << :read
            raw_params[:mode] << :write
          else
            if (raw_params[:raw_mode] &  ::IO::WRONLY) ==  ::IO::WRONLY
              raw_params[:mode] << :write
            else
              if (raw_params[:raw_mode] & ::IO::RDONLY) == ::IO::RDONLY
                raw_params[:mode] << :read
              end
            end
          end
          if (raw_params[:raw_mode] & ::IO::TRUNC) == ::IO::TRUNC
            raw_params[:mode] << :overwrite
          end
          if (raw_params[:raw_mode] & ::IO::APPEND) == ::IO::APPEND
            raw_params[:mode] << :append
          end
          if (raw_params[:raw_mode] & ::IO::CREAT) == ::IO::CREAT
            raw_params[:mode] << :create
          end
        end
      else
        # String
        unless (raw_params[:mode].include?(:binary) || raw_params[:mode].include?(:text))
          if raw_params[:raw_mode].to_s.include?("b")
            raw_params[:mode] << :binary
          else
            raw_params[:mode] << :text
          end
        end
        if raw_params[:raw_mode].to_s.include?("r")
          raw_params[:mode] << :read
          if raw_params[:raw_mode].to_s.include?("+")
            raw_params[:mode] << :write
          end
        else
          if raw_params[:raw_mode].to_s.include?("w")
            raw_params[:mode] << :write
            raw_params[:mode] << :overwrite
            if raw_params[:raw_mode].to_s.include?("+")
              raw_params[:mode] << :read
            end
          else
            if raw_params[:raw_mode].to_s.include?("a")
              raw_params[:mode] << :write
              raw_params[:mode] << :append
              if raw_params[:raw_mode].to_s.include?("+")
                raw_params[:mode] << :read
              end
            end
          end
        end
      end
      raw_params.delete(:raw_mode)
    end
    #
  end
  #
  if raw_params[:external_encoding]
    unless ::Encoding::constants.include?(raw_params[:external_encoding].to_s.to_sym)
      raise ArgumentError, ":external_encoding :#{raw_params[:external_encoding].to_s} unsupported"
    end
  end
  if raw_params[:internal_encoding]
    unless ::Encoding::constants.include?(raw_params[:internal_encoding].to_s.to_sym)
      raise ArgumentError, ":internal_encoding :#{raw_params[:internal_encoding].to_s} unsupported"
    end
  end
  #
  raw_params
end