lib/mutest/reporter/cli/tput.rb
module Mutest
  class Reporter
    class CLI
      # Interface to the optionally present tput binary
      class Tput
        include Concord::Public.new(:prepare, :restore)
        include Adamantium

        private_class_method :new

        # Detected tput support
        #
        # @return [Tput]
        #   if tput support is present
        #
        # @return [nil]
        #   otherwise
        def self.detect
          reset   = capture('tput reset')
          save    = capture('tput sc') if reset
          restore = capture('tput rc') if save
          clean   = capture('tput ed') || capture('tput cd') if restore
          new(reset + save, restore + clean) if clean
        end

        # Capture output
        #
        # @param [String] command
        #   command to run
        #
        # @return [String]
        #   stdout of command on success
        #
        # @return [nil]
        #   otherwise
        def self.capture(command)
          stdout, _stderr, exitstatus = Open3.capture3(command)
          stdout if exitstatus.success?
        end
        private_class_method :capture
      end
    end
  end
end
