summaryrefslogtreecommitdiff
path: root/core/lua/astal/process.lua
diff options
context:
space:
mode:
authorAylur <[email protected]>2024-09-01 02:06:50 +0200
committerAylur <[email protected]>2024-09-01 02:06:50 +0200
commit0738194780ce52b9047c430b9498487417b2cd07 (patch)
treee0cdbcbc31ccbe1620a5f228f18fead658487652 /core/lua/astal/process.lua
parent49cdf5d5e010c9abb9b02034999eef2f49f066b9 (diff)
move libastal to /core
starting point of the monorepo
Diffstat (limited to 'core/lua/astal/process.lua')
-rw-r--r--core/lua/astal/process.lua94
1 files changed, 94 insertions, 0 deletions
diff --git a/core/lua/astal/process.lua b/core/lua/astal/process.lua
new file mode 100644
index 0000000..3d10f8b
--- /dev/null
+++ b/core/lua/astal/process.lua
@@ -0,0 +1,94 @@
+local lgi = require("lgi")
+local Astal = lgi.require("Astal", "0.1")
+
+local M = {}
+
+local defualt_proc_args = function(on_stdout, on_stderr)
+ if on_stdout == nil then
+ on_stdout = function(out)
+ io.stdout:write(tostring(out) .. "\n")
+ return tostring(out)
+ end
+ end
+
+ if on_stderr == nil then
+ on_stderr = function(err)
+ io.stderr:write(tostring(err) .. "\n")
+ return tostring(err)
+ end
+ end
+
+ return on_stdout, on_stderr
+end
+
+---@param commandline string | string[]
+---@param on_stdout? fun(out: string): nil
+---@param on_stderr? fun(err: string): nil
+---@return { kill: function } | nil proc
+function M.subprocess(commandline, on_stdout, on_stderr)
+ local out, err = defualt_proc_args(on_stdout, on_stderr)
+ local proc, fail
+ if type(commandline) == "table" then
+ proc, fail = Astal.Process.subprocessv(commandline)
+ else
+ proc, fail = Astal.Process.subprocess(commandline)
+ end
+ if fail ~= nil then
+ err(fail)
+ return nil
+ end
+ proc.on_stdout = function(_, str)
+ out(str)
+ end
+ proc.on_stderr = function(_, str)
+ err(str)
+ end
+ return proc
+end
+
+---@generic T
+---@param commandline string | string[]
+---@param on_stdout? fun(out: string): T
+---@param on_stderr? fun(err: string): T
+---@return T
+function M.exec(commandline, on_stdout, on_stderr)
+ local out, err = defualt_proc_args(on_stdout, on_stderr)
+ local stdout, stderr
+ if type(commandline) == "table" then
+ stdout, stderr = Astal.Process.execv(commandline)
+ else
+ stdout, stderr = Astal.Process.exec(commandline)
+ end
+ if stderr then
+ return err(stderr)
+ end
+ return out(stdout)
+end
+
+---@param commandline string | string[]
+---@param on_stdout? fun(out: string): nil
+---@param on_stderr? fun(err: string): nil
+function M.exec_async(commandline, on_stdout, on_stderr)
+ local out, err = defualt_proc_args(on_stdout, on_stderr)
+ if type(commandline) == "table" then
+ Astal.Process.exec_asyncv(commandline, function(_, res)
+ local stdout, fail = Astal.exec_asyncv_finish(res)
+ if fail ~= nil then
+ err(fail)
+ else
+ out(stdout)
+ end
+ end)
+ else
+ Astal.Process.exec_async(commandline, function(_, res)
+ local stdout, fail = Astal.exec_finish(res)
+ if fail ~= nil then
+ err(fail)
+ else
+ out(stdout)
+ end
+ end)
+ end
+end
+
+return M