Files
cave.nvim/lua/cave/task.lua
2024-10-02 14:58:20 +02:00

125 lines
2.7 KiB
Lua

local Path = require "cave.path"
local Meta = require "cave.meta"
local Enum = require "cave.enum"
local List = Meta.List
local Map = Meta.Map
local Optional = Meta.Optional
local Str = Meta.String
local validate = Meta.validate
---@enum cave.Task.Tag
local Tag = {
Run = "Run",
Debug = "Debug",
}
Enum.new(Tag, "Task.Tag")
---@class cave.Task
---@field id string
---@field args string[]
---@field cwd cave.Path
---@field env table<string, string>
local Task = Meta.derive "Task"
Task.Tag = Tag
---@return string
function Task:valid_cwd()
assert(self.cwd:is_dir())
return self.cwd:tostring()
end
---@class cave.Task.Factory
---@field id_ string?
---@field args_ string[]
---@field cwd_ cave.Path?
---@field env_ table<string, string>
---@field context_ cave.Context
local Factory = Meta.derive "Task.Factory"
---@param context cave.Context
function Factory:init(context)
self.args_ = {}
self.env_ = {}
self.context_ = context
end
---@param other cave.Task.Factory
function Factory:copy_from(other)
self.id_ = other.id_
self.args_ = vim.deepcopy(other.args_)
self.cwd_ = other.cwd_ and other.cwd_:copy()
self.env_ = vim.deepcopy(other.env_)
self.context_ = other.context_
end
---@return string
function Factory:get_id()
assert(self.id_)
return self.id_
end
---@return string[]
function Factory:get_args() return self.args_ end
---@return cave.Path
function Factory:get_cwd() return self.cwd_ or Path.new(self.context_.dir) end
---@return table<string, string>
function Factory:get_env() return self.env_ end
---@param id string
---@return cave.Task.Factory
function Factory:id(id)
validate { id = { id, Str } }
self.id_ = id
return self
end
---@param args string[]
---@return cave.Task.Factory
function Factory:args(args)
validate { args = { args, List(Str) } }
vim.list_extend(self.args_, args)
return self
end
---@param arg string
---@return cave.Task.Factory
function Factory:arg(arg) return self:args { arg } end
---@param cwd_path_like cave.PathLike
---@return cave.Task.Factory
function Factory:cwd(cwd_path_like)
validate { cwd_path_like = { cwd_path_like, Optional(Path.Like) } }
self.cwd_ = Path.like(cwd_path_like)
return self
end
---@param env table<string, string>
---@return cave.Task.Factory
function Factory:env(env)
validate { env = { env, Map(Str, Str) } }
vim.tbl_extend("error", self.env_, env)
return self
end
---@param task cave.Task
function Factory:init_task(task)
task.id = self:get_id()
task.args = self:get_args()
task.cwd = self:get_cwd()
task.env = self:get_env()
end
---@return cave.Task
function Factory:build() error "Not implemented" end
---@return cave.Task
function Factory:copy() error "Not implemented" end
Task.Factory = Factory
return Task