import path from "node:path" import fs from "node:fs" import { Command, Option } from "clipanion" import * as typanion from "typanion" import chalk from "chalk" import { isExistingPath } from "../../utils/isExistingPath.js" import { template } from "../../services/Template.js" import { Solution } from "../../services/Solution.js" import { TemporaryFolder } from "../../services/TemporaryFolder.js" export class RunSolutionCommand extends Command { public static override paths = [["run", "solution"]] public static override usage = { description: "Run the solution with the given `input.txt` file.", } public programmingLanguage = Option.String("--language", { description: "The programming language used to solve the challenge.", required: true, validator: typanion.isString(), }) public challenge = Option.String("--challenge", { description: "The challenge name where you want to run your solution.", required: true, validator: typanion.isString(), }) public solutionName = Option.String("--solution", { description: "The solution name to run.", required: true, validator: typanion.isString(), }) public inputPathUser = Option.String("--input-path", { description: "The input file path to use.", required: true, validator: typanion.isString(), }) public output = Option.Boolean("--output", false, { description: "Display the output of the solution.", }) public async execute(): Promise { console.log() try { await TemporaryFolder.cleanAll() await template.verifySupportedProgrammingLanguage( this.programmingLanguage, ) const solution = await Solution.get({ name: this.solutionName, challengeName: this.challenge, programmingLanguageName: this.programmingLanguage, }) const inputPath = path.resolve(process.cwd(), this.inputPathUser) if (!(await isExistingPath(inputPath))) { throw new Error(`The \`input-path\` doesn't exist: ${inputPath}.`) } const input = await fs.promises.readFile(inputPath, { encoding: "utf-8" }) await solution.run(input, this.output) await TemporaryFolder.cleanAll() return 0 } catch (error) { if (error instanceof Error) { console.error(`${chalk.bold.red("Error:")} ${error.message}`) } await TemporaryFolder.cleanAll() return 1 } } }