summaryrefslogtreecommitdiff
path: root/utils/run.ts
blob: 90938639a30ddeffc9599f4f35a9c44b40752547 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { Either, type Traceable } from "./mod.ts";

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);
  }
};