summaryrefslogtreecommitdiff
path: root/model/pipeline.ts
diff options
context:
space:
mode:
Diffstat (limited to 'model/pipeline.ts')
-rw-r--r--model/pipeline.ts37
1 files changed, 24 insertions, 13 deletions
diff --git a/model/pipeline.ts b/model/pipeline.ts
index 06361a4..b0db1b7 100644
--- a/model/pipeline.ts
+++ b/model/pipeline.ts
@@ -1,13 +1,20 @@
-import type { FetchCodeJob, Job } from "./mod.ts";
-
-export interface Pipeline {
- getStages(): ReadonlyArray<PipelineStage>;
- serialize(): string;
-}
+import { Either, type IEither, isObject } from "@emprespresso/pengueno";
+import { type FetchCodeJob, isJob, type Job } from "@emprespresso/ci-model";
export interface PipelineStage {
readonly parallelJobs: Array<Job>;
}
+export const isPipelineStage = (t: unknown): t is PipelineStage =>
+ isObject(t) && "parallelJobs" in t && Array.isArray(t.parallelJobs) &&
+ t.parallelJobs.every((j) => isJob(j));
+
+export interface Pipeline {
+ readonly serialJobs: Array<PipelineStage>;
+ serialize(): string;
+}
+export const isPipeline = (t: unknown): t is Pipeline =>
+ isObject(t) && "serialJobs" in t && Array.isArray(t.serialJobs) &&
+ t.serialJobs.every((p) => isPipelineStage(p));
export interface PipelineBuilder {
addStage(stage: PipelineStage): PipelineBuilder;
@@ -15,18 +22,22 @@ export interface PipelineBuilder {
}
export class PipelineImpl implements Pipeline {
- constructor(private readonly serialJobs: ReadonlyArray<PipelineStage>) {}
-
- public getStages() {
- return this.serialJobs;
- }
+ constructor(public readonly serialJobs: Array<PipelineStage>) {}
public serialize() {
return JSON.stringify(this.serialJobs);
}
- public static from(s: string): Pipeline {
- return new PipelineImpl(JSON.parse(s));
+ public static from(s: string): IEither<Error, Pipeline> {
+ return Either.fromFailable<Error, unknown>(() => JSON.parse(s)).flatMap<
+ Pipeline
+ >((
+ eitherPipelineJson,
+ ) =>
+ isPipeline(eitherPipelineJson)
+ ? Either.right(eitherPipelineJson)
+ : Either.left(new Error("oh noes D: its a bad pipewine :(("))
+ ).mapRight((pipeline) => new PipelineImpl(pipeline.serialJobs));
}
}