35 lines · 1.2 KB
import { MARKER_PREFIX } from "./script";

type Marker =
  | { type: "step-start"; index: number }
  | { type: "step-end"; index: number; code: number }
  | { type: "step-skip"; index: number }
  | { type: "artifact"; name: string; path: string }
  | { type: "job-end"; failed: boolean }
  | { type: "setup-start" }
  | { type: "setup-end"; code: number };

export function parseMarker(line: string): Marker | null {
  if (!line.startsWith(MARKER_PREFIX)) return null;
  const [type, ...args] = line.slice(MARKER_PREFIX.length).trim().split(" ");
  const number = (value: string | undefined) => Number(value ?? "0");
  switch (type) {
    case "step-start":
      return { type, index: number(args[0]) };
    case "step-end":
      return { type, index: number(args[0]), code: number(args[1]) };
    case "step-skip":
      return { type, index: number(args[0]) };
    case "artifact":
      return { type, name: args[0] ?? "artifact", path: args.slice(1).join(" ").replace(/^"|"$/g, "") };
    case "job-end":
      return { type, failed: args[0] !== "0" };
    case "setup-start":
      return { type };
    case "setup-end":
      return { type, code: number(args[0]) };
    default:
      return null;
  }
}