mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-11 18:14:00 +08:00
63 lines
1.5 KiB
Lua
Vendored
63 lines
1.5 KiB
Lua
Vendored
local uv = require('luv')
|
|
local AsyncTask = require('cmp_dictionary.kit.Async.AsyncTask')
|
|
|
|
---@class cmp_dictionary.kit.Thread.WorkerOption
|
|
---@field public runtimepath string[]
|
|
|
|
local Worker = {}
|
|
Worker.__index = Worker
|
|
|
|
---Create a new thread.
|
|
---@param runner function
|
|
function Worker.new(runner)
|
|
local self = setmetatable({}, Worker)
|
|
self.runner = string.dump(runner)
|
|
return self
|
|
end
|
|
|
|
---Call worker function.
|
|
---@return cmp_dictionary.kit.Async.AsyncTask
|
|
function Worker:__call(...)
|
|
local args_ = { ... }
|
|
return AsyncTask.new(function(resolve, reject)
|
|
uv.new_work(function(runner, args, option)
|
|
args = vim.mpack.decode(args)
|
|
option = vim.mpack.decode(option)
|
|
|
|
--Initialize cwd.
|
|
require('luv').chdir(option.cwd)
|
|
|
|
--Initialize package.loaders.
|
|
table.insert(package.loaders, 2, vim._load_package)
|
|
|
|
--Run runner function.
|
|
local ok, res = pcall(function()
|
|
return require('cmp_dictionary.kit.Async.AsyncTask').resolve(assert(loadstring(runner))(unpack(args))):sync()
|
|
end)
|
|
|
|
res = vim.mpack.encode({ res })
|
|
|
|
--Return error or result.
|
|
if not ok then
|
|
return res, nil
|
|
else
|
|
return nil, res
|
|
end
|
|
end, function(err, res)
|
|
if err then
|
|
reject(vim.mpack.decode(err)[1])
|
|
else
|
|
resolve(vim.mpack.decode(res)[1])
|
|
end
|
|
end):queue(
|
|
self.runner,
|
|
vim.mpack.encode(args_),
|
|
vim.mpack.encode({
|
|
cwd = uv.cwd(),
|
|
})
|
|
)
|
|
end)
|
|
end
|
|
|
|
return Worker
|