local log = require "telescope.log" local Job = require "plenary.job" local async_lib = require "plenary.async_lib" local async = async_lib.async -- local await = async_lib.await local void = async_lib.void local make_entry = require "telescope.make_entry" return function(opts) local entry_maker = opts.entry_maker or make_entry.gen_from_string() local fn_command = function(prompt) local command_list = opts.command_generator(prompt) if command_list == nil then return nil end local command = table.remove(command_list, 1) return { command = command, args = command_list, } end local job return setmetatable({ close = function() end, }, { __call = void(async(function(prompt, process_result, process_complete) print("are we callin anything?", job) if job and not job.is_shutdown then log.debug "Shutting down old job" job:shutdown() end local job_opts = fn_command(prompt) if not job_opts then return end local writer = nil if job_opts.writer and Job.is_job(job_opts.writer) then writer = job_opts.writer elseif opts.writer then writer = Job:new(job_opts.writer) end job = Job:new { command = job_opts.command, args = job_opts.args, cwd = job_opts.cwd or opts.cwd, maximum_results = opts.maximum_results, writer = writer, enable_recording = false, on_stdout = vim.schedule_wrap(function(_, line) if not line or line == "" then return end -- TODO: shutdown job here. process_result(entry_maker(line)) end), on_exit = function() process_complete() end, } job:start() end)), }) end