summaryrefslogtreecommitdiff
path: root/u/process/run.ts
diff options
context:
space:
mode:
Diffstat (limited to 'u/process/run.ts')
-rw-r--r--u/process/run.ts40
1 files changed, 40 insertions, 0 deletions
diff --git a/u/process/run.ts b/u/process/run.ts
new file mode 100644
index 0000000..6dc37d0
--- /dev/null
+++ b/u/process/run.ts
@@ -0,0 +1,40 @@
+import { Either, type Traceable } from "@emprespresso/utils";
+
+export class ProcessError extends Error {}
+export const getStdout = async (
+ { item: cmd, logger: _logger }: Traceable<string[] | string>,
+ options: Deno.CommandOptions = {},
+): Promise<Either<ProcessError, string>> => {
+ const logger = _logger.addTracer(() => "[getStdout]");
+
+ logger.log(`:> im gonna run this command!`, cmd);
+ const [exec, ...args] = (typeof cmd === "string") ? cmd.split(" ") : cmd;
+ const command = new Deno.Command(exec, {
+ args,
+ stdout: "piped",
+ stderr: "piped",
+ ...options,
+ });
+
+ try {
+ const { code, stdout, stderr } = await command.output();
+ const stdoutText = new TextDecoder().decode(stdout);
+ const stderrText = new TextDecoder().decode(stderr);
+
+ if (code !== 0) {
+ logger.error(`i weceived an exit code of ${code} i wanna zeroooo :<`);
+ return Either.left<ProcessError, string>(
+ new ProcessError(`command failed\n${stderrText}`),
+ );
+ }
+
+ logger.log("yay! i got code 0 :3", cmd);
+ return Either.right<ProcessError, string>(stdoutText);
+ } catch (e) {
+ logger.error(`o.o wat`, e);
+ if (e instanceof Error) {
+ return Either.left<ProcessError, string>(e);
+ }
+ throw new Error("unknown error " + e);
+ }
+};