diff options
Diffstat (limited to 'src/cli_ffi.erl')
-rw-r--r-- | src/cli_ffi.erl | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/cli_ffi.erl b/src/cli_ffi.erl index 1c1b6f0..b23dec3 100644 --- a/src/cli_ffi.erl +++ b/src/cli_ffi.erl @@ -3,7 +3,8 @@ get_cpu/0, get_esbuild/1, get_os/0, - unzip_esbuild/1 + unzip_esbuild/1, + exec/3 ]). get_os() -> @@ -47,3 +48,28 @@ unzip_esbuild(Zip) -> {ok, Res} -> {error, Res}; {error, Err} -> {error, Err} end. + +exec(Command, Args, Cwd) -> + Command_ = binary_to_list(Command), + Args_ = lists:map(fun(Arg) -> binary_to_list(Arg) end, Args), + Cwd_ = binary_to_list(Cwd), + + Name = case Command_ of + "./" ++ _ -> {spawn_executable, Command_}; + "/" ++ _ -> {spawn_executable, Command_}; + _ -> {spawn_executable, os:find_executable(Command_)} + end, + + Port = open_port(Name, [exit_status, binary, hide, stream, + {args, Args_}, + {cd, Cwd_} + ]), + + do_exec(Port, []). + +do_exec(Port, Acc) -> + receive + {Port, {data, Data}} -> do_exec(Port, [Data | Acc]); + {Port, {exit_status, 0}} -> {ok, lists:reverse(Acc)}; + {Port, {exit_status, Code}} -> {error, {Code, lists:reverse(Acc)}} + end. |