-
-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathnim.lua
148 lines (137 loc) · 6.41 KB
/
nim.lua
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
--- Nim language actions
local M = {}
--- Frontend - options displayed on telescope
M.options = {
{ text = "Build and run main program", value = "option1" },
{ text = "Build main program", value = "option2" },
{ text = "Run main program", value = "option3" },
{ text = "Build solution", value = "option4" },
{ text = "Run this file", value = "option5" },
}
--- Backend - overseer tasks performed on option selected
function M.action(selected_option)
local utils = require("compiler.utils")
local overseer = require("overseer")
local current_file = vim.fn.expand("%:p")
local entry_point = utils.os_path(vim.fn.getcwd() .. "/src/main.nim") -- working_directory/main.nim
local output_dir = utils.os_path(vim.fn.getcwd() .. "/bin/") -- working_directory/bin/
local output = utils.os_path(vim.fn.getcwd() .. "/bin/program") -- working_directory/bin/program
local current_file_output = output_dir
.. vim.fn.fnamemodify(current_file, ":t:r")
local arguments = "" -- arguments can be overriden in .solution
local final_message = "--task finished--"
if selected_option == "option1" then
-- stylua: ignore start
local task = overseer.new_task({
name = "- Nim compiler",
strategy = { "orchestrator",
tasks = {{ name = "- Build & run program → \"" .. entry_point .. "\"",
cmd = "rm -f \"" .. output .. "\" || true" .. -- clean
" && mkdir -p \"" .. output_dir .. "\"" .. -- mkdir
" && nim c -r " .. arguments .. " -o=" .. output .. " " .. entry_point .. -- compile
-- " && \"" .. output .. "\"" .. -- run
" && echo \"" .. entry_point .. "\"" .. -- echo
" && echo \"" .. final_message .. "\"",
components = { "default_extended" }
},},},})
task:start()
-- stylua: ignore end
elseif selected_option == "option2" then
-- stylua: ignore start
local task = overseer.new_task({
name = "- Nim compiler",
strategy = { "orchestrator",
tasks = {{ name = "- Build program → \"" .. entry_point .. "\"",
cmd = "rm -f \"" .. output .. "\" || true" .. -- clean
" && mkdir -p \"" .. output_dir .. "\"" .. -- mkdir
" && nim c " .. arguments .. " -o=" .. output .. " " .. entry_point .. -- compile
" && echo \"" .. entry_point .. "\"" .. -- echo
" && echo \"" .. final_message .. "\"",
components = { "default_extended" }
},},},})
task:start()
-- stylua: ignore end
elseif selected_option == "option3" then
-- stylua: ignore start
local task = overseer.new_task({
name = "- Nim compiler",
strategy = { "orchestrator",
tasks = {{ name = "- Run program → \"" .. output .. "\"",
cmd = "\"" .. output .. "\"" .. -- run
" && echo \"" .. output .. "\"" .. -- echo
" && echo \"" .. final_message .. "\"",
components = { "default_extended" }
},},},})
task:start()
-- stylua: ignore end
elseif selected_option == "option4" then
local entry_points
local task = {}
local tasks = {}
local executables = {}
local solution_file = utils.get_solution_file()
if solution_file then
local config = utils.parse_solution_file(solution_file)
for entry, variables in pairs(config) do
if entry == "executables" then goto continue end
entry_point = utils.os_path(variables.entry_point)
output = utils.os_path(variables.output)
output_dir = utils.os_path(output:match("^(.-[/\\])[^/\\]*$"))
arguments = variables.arguments or arguments -- optional
-- stylua: ignore start
task = { name = "- Build program → \"" .. entry_point .. "\"",
cmd = "rm -f \"" .. output .. "\" || true" .. -- clean
" && mkdir -p \"" .. output_dir .. "\"" .. -- mkdir
" && nim c " .. arguments .. " -o=" .. output .. " " .. entry_point .. -- compile
" && echo \"" .. entry_point .. "\"" .. -- echo
" && echo \"" .. final_message .. "\"",
components = { "default_extended" }
}
-- stylua: ignore end
table.insert(tasks, task) -- store all the tasks we've created
::continue::
end
local solution_executables = config["executables"]
if solution_executables then
for entry, executable in pairs(solution_executables) do
executable = utils.os_path(executable, true)
-- stylua: ignore start
task = { name = "- Run program → " .. executable,
cmd = executable .. -- run
" && echo " .. executable .. -- echo
" && echo \"" .. final_message .. "\"",
components = { "default_extended" }
}
-- stylua: ignore end
table.insert(executables, task) -- store all the executables we've created
end
end
task = overseer.new_task({
name = "- Nim compiler",
strategy = {
"orchestrator",
tasks = {
tasks, -- Build all the programs in the solution in parallel
executables, -- Then run the solution executable(s)
},
},
})
task:start()
end
elseif selected_option == "option5" then
-- stylua: ignore start
local task = overseer.new_task({
name = "- Nim compiler",
strategy = { "orchestrator",
tasks = {{ name = "- Build & run program → \"" .. current_file .. "\"",
cmd = "rm -f \"" .. current_file_output .. "\" || true" .. -- clean
" && mkdir -p \"" .. output_dir .. "\"" .. -- mkdir
" && nim c -r " .. arguments .. " -o=" .. current_file_output .. " " .. current_file .. -- compile
" && echo \"" .. current_file .. "\"" .. -- echo
" && echo \"" .. final_message .. "\"",
components = { "default_extended" }
},},},})
task:start()
end
end
return M