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