require "shell/job_control" require "shell/logger" module Shell class Builtins attr_reader :job_control, :logger def initialize(job_control: nil, logger: nil) logger ||= Logger.instance @job_control = job_control || JobControl.new(logger: logger) @logger = logger end def exec(name, args) send(:"builtin_#{name}", args) end def builtin?(name) respond_to?(:"builtin_#{name}") end ################# ### Built-ins ### ################# def builtin_bg(args) cmd = args.shift job_control.exec_command(cmd, args, background: true) end def builtin_bglist(_args) jobs = job_control.list puts unless jobs.empty? jobs.each do |job| puts job_control.format_job(job) end plural = (jobs.count == 1) ? "" : "s" puts "#{jobs.count} background job#{plural}" 0 end def builtin_bgkill(args) if args.count != 1 logger.warn "Usage: bgkill " return -1 end job_id = args.shift.to_i job_control.kill(job_id) 0 end def builtin_cd(args) Dir.chdir args.first 0 end def builtin_export(args) # only supports one variable and doesn't support quoting name, *value_parts = args.first.strip.split("=") if name.nil? || name.empty? logger.warn "#{red("[ERROR]")} Invalid export command" else ENV[name] = value_parts.join("=").gsub(/\$\w+/) { |m| ENV[m[1..]] || "" } end 0 end def builtin_pwd(_args) puts Dir.pwd 0 end def builtin_clear(_args) print "\033[2J" 0 end end end