import { getStdout, type ITraceable, LogLevel, type LogMetricTraceSupplier, memoize, Metric, TraceUtil, validateExecutionEntries, } from "@emprespresso/pengueno"; import type { Job } from "@emprespresso/ci-model"; const jobTypeMetric = memoize((type: string) => Metric.fromName(`run.${type}`)); export const executeJob = (tJob: ITraceable) => tJob.bimap(TraceUtil.withMetricTrace(jobTypeMetric(tJob.get().type))) .peek((tJob) => tJob.trace.trace( `let's do this little job ok!! ${tJob.get()}`, ) ) .map((tJob) => validateExecutionEntries(tJob.get().arguments) .mapLeft((badEntries) => { tJob.trace.addTrace(LogLevel.ERROR).trace( badEntries.toString(), ); return new Error("invalid job arguments"); }) .flatMapAsync((args) => getStdout(tJob.move(tJob.get().type), { env: args }) ) ) .peek( TraceUtil.promiseify((q) => q.trace.trace( q.get().fold((err, _val) => jobTypeMetric(tJob.get().type)[err ? "failure" : "success"] ), ) ), ) .get();