import { parseGoBuildTags } from "../domain/go-build-tags.ts"; export type GoTestPlan = { language: "go"; cwd: string; command: "go"; args: string[]; displayCommand: string; }; export type PlanGoTestFromSlashArgsInput = { argsTail?: string; cwd: string; }; export function planGoTestFromSlashArgs( input: PlanGoTestFromSlashArgsInput, ): GoTestPlan { const tags = parseTagsFromSlashArgs(input.argsTail ?? ""); const args = ["test", "-race"]; if (tags !== undefined) { args.push(`-tags=${tags}`); } args.push("./..."); return { language: "go", cwd: input.cwd, command: "go", args, displayCommand: ["go", ...args].join(" "), }; } function parseTagsFromSlashArgs(argsTail: string): string | undefined { const trimmed = argsTail.trim(); if (trimmed === "") return undefined; const tokens = trimmed.split(/\s+/); const [first, second, ...rest] = tokens; if (first === "--tags") { if (second === undefined || second === "") { throw new Error("Missing Go build tags value"); } if (rest.length > 0) { throw new Error(`Unsupported test arguments: ${rest.join(" ")}`); } return parseGoBuildTags(second); } if (first.startsWith("--tags=")) { if (tokens.length > 1) { throw new Error( `Unsupported test arguments: ${tokens.slice(1).join(" ")}`, ); } const tags = first.slice("--tags=".length); if (tags === "") { throw new Error("Missing Go build tags value"); } return parseGoBuildTags(tags); } if (first.startsWith("-")) { throw new Error(`Unsupported test argument: ${first}`); } return parseGoBuildTags(trimmed); }