# frozen_string_literal: true

namespace :praxis do
  desc 'Run interactive pry/irb console'
  task :console do
    have_pry = false

    begin
      # Use pry if available; require pry _before_ environment to maximize
      # debuggability.
      require 'pry'
      have_pry = true
    rescue LoadError
      # Fall back on irb
      require 'irb'
    end

    Rake::Task['praxis:environment'].invoke

    if have_pry
      Praxis::Application.instance.pry
    else
      # Keep IRB.setup from complaining about bad ARGV options
      old_argv = ARGV.dup
      ARGV.clear
      IRB.setup nil
      ARGV.concat(old_argv)

      # Allow reentrant IRB
      IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context
      require 'irb/ext/multi-irb'

      # Use some special initialization magic to ensure that 'self' in the
      # IRB session refers to Praxis::Application.instance.
      IRB.irb(nil, Praxis::Application.instance)
    end
  end
end
