require 'shell/colours' require 'shell/logger' require 'shell/repl' module Shell class CLI include Colours attr_reader :logger, :options, :repl def initialize(logger: nil, repl: nil) @logger = logger || Logger.instance @options = {} @repl = repl || REPL.new(logger: @logger) @repl.precmd_hook = -> { print_logs } end def run(args: nil) @options = parse_options(args || ARGV) logger.verbose "Options: #{options.inspect}" if options[:command] logger.verbose "Executing command: #{options[:command]}" print_logs exit repl.process_command(options[:command]) elsif $stdin.isatty repl.start(options: options) end end def parse_options(args) options = { verbose: false, } while (arg = args.shift) case arg when '-c' options[:command] = args.shift if options[:command].nil? warn 'ERROR: expected string after -c' exit 1 end when '-v', '--verbose' options[:verbose] = true else logger.warn "#{red('[ERROR]')} Unknown argument: #{arg}" exit 1 end end options end def print_logs logger.logs.each do |log| message = "#{log.message}#{CLEAR}" case log.level when :verbose warn message if options[:verbose] else warn message end end logger.clear end end end