| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- include_guard "run_process_output"
- template run_process_output {
- alias(@_arg0) command;
-
- # We collect the results here.
- var(@false) succeeded;
- value("") output;
-
- var(@true) do;
- backtrack_point() done;
- If (do) {
- do->set(@false);
- # Start child process.
- sys.start_process(command, "r", ["keep_stderr":"true"]) proc;
- If (proc.is_error) {
- done->go();
- };
-
- # Get read pipe handle.
- proc->read_pipe() read_pipe;
- If (read_pipe.is_error) {
- done->go();
- };
-
- # Read all contents.
- backtrack_point() read_again;
- read_pipe->read() read;
- If (read.not_eof) {
- output->append(read);
- read_again->go();
- };
-
- # Wait for the process to terminate.
- proc->wait() wait;
- val_different(wait.exit_status, "0") not_ok;
- If (not_ok) {
- done->go();
- };
-
- # Assume success.
- succeeded->set(@true);
- done->go();
- };
- }
|