aboutsummaryrefslogtreecommitdiff
path: root/lua/cmake/actions.lua
blob: ff64f959bb29f2eb0b3797ab692629f1a7465397 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
local pr = require("cmake.project")
local config = require("cmake.config")
local t = require("cmake.terminal")
local Path = require("plenary.path")

local M = {}

local default_generate_exe_opts = {
	notify = {
		ok_message = "CMake build finished",
		err_message = function(code)
			return "CMake generate failed with code " .. tostring(code)
		end,
	},
}

local default_build_exe_opts = {
	notify = {
		ok_message = "CMake build finished",
		err_message = function(code)
			return "CMake build failed with code " .. tostring(code)
		end,
	},
}

M.generate = function(opts)
	pr.create_fileapi_query({ idx = pr.current_generate_option_idx() }, function()
		vim.schedule(function()
			t.cmake_execute(pr.current_generate_option().generate_command, default_generate_exe_opts)
		end)
	end)
end

M.generate_select = function(opts)
	local items = pr.generate_options(opts)
	vim.ui.select(items, {
		prompt = "Select configuration to generate:",
		format_item = function(item)
			return table.concat(item.name, config.variants_display.short.sep)
		end,
	}, function(choice, idx)
		if not idx then
			return
		end
		pr.set_current_generate_option(idx)
		pr.create_fileapi_query({ idx = idx }, function()
			vim.schedule(function()
				t.cmake_execute(choice.generate_command, default_generate_exe_opts)
			end)
		end)
	end)
end

M.build = function(opts)
	if not pr.current_build_option_idx() then
		M.build_select(opts)
	else
		pr.create_fileapi_query({ idx = pr.current_build_option_idx() }, function()
			vim.schedule(function()
				t.cmake_execute(pr.current_build_option().command, default_build_exe_opts)
			end)
		end)
	end
end

M.build_select = function(opts)
	local items = pr.current_generate_option(opts).build_options
	vim.ui.select(items, {
		prompt = "Select build option to generate:",
		format_item = function(item)
			return table.concat(item.name, config.variants_display.short.sep)
		end,
	}, function(choice, idx)
		if not idx then
			return
		end
		pr.set_current_build_option(idx)
		pr.create_fileapi_query({ idx = idx }, function()
			vim.schedule(function()
				t.cmake_execute(choice.command, default_build_exe_opts)
			end)
		end)
	end)
end

M.run_tagret = function(opts)
	opts = opts or {}
	local _curr_exe_cmd = pr.current_executable_target()
	if not _curr_exe_cmd then
		M.run_tagret_select(opts)
	else
		local command = {
			cmd = Path:new(pr.current_directory(), _curr_exe_cmd.path):make_relative(vim.loop.cwd()),
		}
		t.target_execute(command)
	end
end

M.run_tagret_select = function(opts)
	opts = opts or {}
	opts.type = "EXECUTABLE"
	local items = pr.current_targets(opts)
	vim.ui.select(items, {
		prompt = "Select tagret to run:",
		format_item = function(item)
			return item.name
		end,
	}, function(choice, idx)
		if not idx then
			return
		end
		pr.set_current_executable_target(idx)
		local command = {
			cmd = Path:new(pr.current_directory(), choice.path):make_relative(vim.loop.cwd()),
		}
		t.target_execute(command)
	end)
end

M.toggle = function()
	t.cmake_toggle()
end

return M