|  | 
| 1 | 1 | package core | 
| 2 | 2 | 
 | 
|  | 3 | +// https://refactoring.guru/design-patterns/builder | 
|  | 4 | + | 
| 3 | 5 | import ( | 
| 4 | 6 | 	"github.com/jpnt/kman/pkg/logger" | 
| 5 | 7 | ) | 
| 6 | 8 | 
 | 
| 7 | 9 | type IPipelineBuilder interface { | 
| 8 | 10 | 	WithStep(stepName string) IPipelineBuilder | 
| 9 | 11 | 	WithDefault() IPipelineBuilder | 
|  | 12 | +	Build() IPipeline | 
| 10 | 13 | } | 
| 11 | 14 | 
 | 
| 12 | 15 | type PipelineBuilder struct { | 
| 13 | 16 | 	logger  logger.ILogger | 
| 14 |  | -	pl      IPipeline | 
| 15 | 17 | 	factory IStepFactory | 
|  | 18 | +	ctx     IKernelContext | 
|  | 19 | +	steps   []IStep | 
| 16 | 20 | } | 
| 17 | 21 | 
 | 
| 18 | 22 | // Ensure struct implements interface | 
| 19 | 23 | var _ IPipelineBuilder = (*PipelineBuilder)(nil) | 
| 20 | 24 | 
 | 
| 21 |  | -func NewPipelineBuilder(l logger.ILogger, p IPipeline, f IStepFactory) IPipelineBuilder { | 
| 22 |  | -	return &PipelineBuilder{logger: l, pl: p, factory: f} | 
|  | 25 | +func NewPipelineBuilder(l logger.ILogger, f IStepFactory, c IKernelContext) IPipelineBuilder { | 
|  | 26 | +	return &PipelineBuilder{logger: l, factory: f, ctx: c} | 
| 23 | 27 | } | 
| 24 | 28 | 
 | 
| 25 | 29 | func (b *PipelineBuilder) WithStep(stepName string) IPipelineBuilder { | 
| 26 |  | -	step, err := b.factory.CreateStep(stepName, b.logger, b.pl.Ctx()) | 
|  | 30 | +	step, err := b.factory.CreateStep(stepName, b.logger, b.ctx) | 
| 27 | 31 | 	if err != nil { | 
| 28 |  | -		b.logger.Warn("Unrecognized step: %q", stepName) | 
|  | 32 | +		b.logger.Warn("Failed to create step %s: %s", stepName, err) | 
| 29 | 33 | 		return b | 
| 30 | 34 | 	} | 
| 31 |  | -	b.pl.AddStep(step) | 
|  | 35 | +	b.steps = append(b.steps, step) | 
|  | 36 | + | 
| 32 | 37 | 	return b | 
| 33 | 38 | } | 
| 34 | 39 | 
 | 
| 35 | 40 | func (b *PipelineBuilder) WithDefault() IPipelineBuilder { | 
| 36 |  | -	return b. | 
| 37 |  | -		WithStep("list"). | 
| 38 |  | -		WithStep("download"). | 
| 39 |  | -		WithStep("verify"). | 
| 40 |  | -		WithStep("extract"). | 
| 41 |  | -		WithStep("patch"). | 
| 42 |  | -		WithStep("configure"). | 
| 43 |  | -		WithStep("compile"). | 
| 44 |  | -		WithStep("install"). | 
| 45 |  | -		WithStep("initramfs"). | 
| 46 |  | -		WithStep("bootloader") | 
|  | 41 | +	availableSteps := b.factory.AvailableSteps() | 
|  | 42 | + | 
|  | 43 | +	for _, stepName := range availableSteps { | 
|  | 44 | +		b.WithStep(stepName) | 
|  | 45 | +	} | 
|  | 46 | + | 
|  | 47 | +	return b | 
|  | 48 | +} | 
|  | 49 | + | 
|  | 50 | +func (b *PipelineBuilder) Build() IPipeline { | 
|  | 51 | +	return &Pipeline{log: b.logger, ctx: b.ctx, steps: b.steps} | 
| 47 | 52 | } | 
0 commit comments