mash/lib/mash/helpers.ex
2023-08-10 08:30:20 +00:00

54 lines
1.2 KiB
Elixir

defmodule Mash.Helpers do
@moduledoc """
Helpers that provide a simple way to write Mash configs.
"""
def mix(task, args \\ []) do
preferred_mix_env = Mix.Task.preferred_cli_env(task) || Mix.env()
fn io_pid ->
cmd("mix", [task | args], io_pid, [{"MIX_ENV", Atom.to_string(preferred_mix_env)}])
end
end
def shell(command, args \\ []) do
fn io_pid ->
cmd(command, args, io_pid)
end
end
def fun(fun) do
fn io_pid ->
Process.group_leader(self(), io_pid)
try do
case fun.() do
:ok ->
{[], 0}
{:ok, _any} ->
{[], 0}
other ->
IO.puts(IO.ANSI.red() <> "** (fun) failed: #{inspect(other)}" <> IO.ANSI.reset())
{[], 1}
end
rescue
e ->
IO.puts(IO.ANSI.red() <> "** (fun) failed: #{Exception.message(e)}" <> IO.ANSI.reset())
{[], 1}
end
end
end
defp cmd(command, args, io_pid, env \\ []) do
exec_string = "-c #{command} #{Enum.join(args, " ")}"
System.cmd("script", ["-eqf", exec_string, "/dev/null"],
into: IO.stream(io_pid, :line),
env: env,
parallelism: true,
stderr_to_stdout: true
)
end
end