import assert from 'assert'; import { Pipeline } from './Pipeline'; import type { TransitionResolver } from './spi/types'; import type { OnErrorHandler, StatefulPipelineEntity, HandlerContext, StateRepository, OnBeforeHandler, OnAfterHandler } from './types'; class PipelineBuilder, S, C extends HandlerContext> { private repository: StateRepository; private resolver: TransitionResolver; private failedState: S; private onErrorHandler: OnErrorHandler; private onBeforeHandler: OnBeforeHandler; private onAfterHandler: OnAfterHandler; withStateRepository(repository: StateRepository): PipelineBuilder { this.repository = repository; return this; } withTransitionResolver(resolver: TransitionResolver): PipelineBuilder { this.resolver = resolver; return this; } withFailedState(failedState: S): PipelineBuilder { this.failedState = failedState; return this; } withErrorHandler(handler: OnErrorHandler): PipelineBuilder { this.onErrorHandler = handler; return this; } withOnBeforeHandler(handler: OnBeforeHandler): PipelineBuilder { this.onBeforeHandler = handler; return this; } withOnAfterHandler(handler: OnAfterHandler): PipelineBuilder { this.onAfterHandler = handler; return this; } build(): Pipeline { assert(this.resolver, 'A handler resolver must be supplied'); assert(this.repository, 'A state repository must be supplied'); return new Pipeline( this.resolver, this.repository, this.failedState, this.onErrorHandler, this.onBeforeHandler, this.onAfterHandler ); } } // eslint-disable-next-line prettier/prettier function createPipelineBuilder , S, C extends HandlerContext>(): PipelineBuilder { return new PipelineBuilder(); } export { createPipelineBuilder };