tori-rs/ocaml/lib/system/process/reader.ml
2025-04-19 19:09:16 -03:00

48 lines
1.5 KiB
OCaml

open Utilities.Aliases
type output = { output : string; error : string; status : string }
let handle_exit_status (status : Unix.process_status) : string =
match status with
| Unix.WEXITED n -> "Exit " ^ str_int n
| Unix.WSIGNALED n -> "Kill " ^ str_int n
| Unix.WSTOPPED n -> "Stopped " ^ str_int n
let read (env : string array) (command : string) : output =
let stdout, stdin, stderr = Unix.open_process_full command env in
let in_buffer = Buffer.create 4096 in
let err_buffer = Buffer.create 4096 in
let rec read_in () =
let in_line = input_line stdout in
Buffer.add_string in_buffer in_line;
Buffer.add_char in_buffer '\n';
read_in ()
in
try read_in ()
with End_of_file -> (
();
let rec read_err () =
let err_line = input_line stderr in
Buffer.add_string err_buffer err_line;
Buffer.add_char err_buffer '\n';
read_err ()
in
try read_err ()
with End_of_file ->
let exit_status =
handle_exit_status (Unix.close_process_full (stdout, stdin, stderr))
in
{
output = String.trim (Buffer.contents in_buffer);
error = Buffer.contents err_buffer;
status = exit_status;
}
)
let format (output : output) : string =
match output with
| { output = o; error = _; status = "Exit 0" } -> o
| { output = ""; error = e; status = s } -> "[" ^ s ^ "]" ^ " " ^ e
| { output = o; error = _; status = s } -> "[" ^ s ^ "]" ^ " " ^ o