buildr/internal/execution/local/context.go

118 lines
2.7 KiB
Go
Raw Normal View History

package local
2023-03-15 17:56:38 +00:00
import (
"context"
"io"
"log/slog"
2023-03-15 17:56:38 +00:00
"code.icb4dc0.de/buildr/buildr/modules/state"
"code.icb4dc0.de/buildr/buildr/internal/logging"
"code.icb4dc0.de/buildr/buildr/modules"
2023-04-11 20:30:48 +00:00
)
2023-03-15 17:56:38 +00:00
var _ modules.ExecutionContext = (*DefaultExecutionContext)(nil)
2023-03-15 17:56:38 +00:00
type DefaultExecutionContextOption interface {
ApplyToDefaultExecutionContext(ctx *DefaultExecutionContext)
}
type defaultExecutionContextOptionFunc func(ctx *DefaultExecutionContext)
func (f defaultExecutionContextOptionFunc) ApplyToDefaultExecutionContext(ctx *DefaultExecutionContext) {
f(ctx)
}
func WithLoggerFactory(factory func() *slog.Logger) defaultExecutionContextOptionFunc {
return func(ctx *DefaultExecutionContext) {
ctx.loggerFactory = factory
}
}
func NewDefaultExecutionContext(
ctx context.Context,
store state.Store,
mod modules.ModuleWithMeta,
workingDir, outDir, binDir, logsDir string,
logToStdErr bool,
2023-03-15 17:56:38 +00:00
opts ...DefaultExecutionContextOption,
) (DefaultExecutionContext, error) {
2023-03-15 17:56:38 +00:00
execCtx := DefaultExecutionContext{
Context: ctx,
mod: mod,
workingDir: workingDir,
outDir: outDir,
binDir: binDir,
store: store,
2023-03-15 17:56:38 +00:00
}
for i := range opts {
opts[i].ApplyToDefaultExecutionContext(&execCtx)
}
outputSink, err := logging.NewTaskOutputSink(logsDir, logToStdErr, modules.LogFileNameFormatter(mod))
if err != nil {
return DefaultExecutionContext{}, err
}
execCtx.outputSink = outputSink
return execCtx, nil
2023-03-15 17:56:38 +00:00
}
type DefaultExecutionContext struct {
context.Context
2023-06-22 16:06:56 +00:00
outputSink logging.TaskOutputSink
mod modules.ModuleWithMeta
store state.Store
2023-03-15 17:56:38 +00:00
loggerFactory func() *slog.Logger
2023-06-22 16:06:56 +00:00
workingDir string
outDir string
binDir string
2023-03-15 17:56:38 +00:00
}
2023-05-24 20:10:01 +00:00
func (d DefaultExecutionContext) Name() string {
return d.mod.Name()
}
2023-03-15 17:56:38 +00:00
func (d DefaultExecutionContext) GetState(ctx context.Context, key string) ([]byte, state.Metadata, error) {
k := state.KeyOfStrings(d.mod.Category(), d.mod.Name(), key)
return d.store.Get(ctx, k)
}
func (d DefaultExecutionContext) SetState(ctx context.Context, key string, value []byte) error {
k := state.KeyOfStrings(d.mod.Category(), d.mod.Name(), key)
return d.store.Set(ctx, k, value)
}
func (d DefaultExecutionContext) WorkingDir() string {
return d.workingDir
}
func (d DefaultExecutionContext) OutDir() string {
return d.outDir
}
func (d DefaultExecutionContext) BinariesDir() string {
return d.binDir
}
func (d DefaultExecutionContext) StdOut() io.Writer {
return d.outputSink.StdOut()
}
func (d DefaultExecutionContext) StdErr() io.Writer {
return d.outputSink.StdErr()
}
2023-03-15 17:56:38 +00:00
func (d DefaultExecutionContext) Logger() *slog.Logger {
if d.loggerFactory != nil {
return d.loggerFactory()
}
return slog.Default()
}
func (d DefaultExecutionContext) Close() error {
return d.outputSink.Close()
}