77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
// Package preflight checks resolved processing inputs and prepares output resources.
|
|
package preflight
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/config"
|
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/diagnostics"
|
|
"gitea.maximumdirect.net/eric/audita/v3/internal/core/schema"
|
|
)
|
|
|
|
// Input contains already acquired application and transcript inputs.
|
|
type Input struct {
|
|
Config *config.Config
|
|
Transcript *schema.SourceTranscript
|
|
Output diagnostics.OutputSelection
|
|
InitialReports diagnostics.ReportBundle
|
|
FailedReports diagnostics.ReportBundle
|
|
Debug *DebugInput
|
|
}
|
|
|
|
type DebugInput struct {
|
|
WorkDir string
|
|
RunID string
|
|
Metadata diagnostics.InvocationMetadata
|
|
EffectiveConfig []byte
|
|
Secrets []string
|
|
}
|
|
|
|
type Prepared struct {
|
|
Output *diagnostics.OutputSession
|
|
Debug *diagnostics.RunDirectory
|
|
Warnings []error
|
|
}
|
|
|
|
// Prepare validates invocation inputs and collisions before acquiring outputs.
|
|
func Prepare(ctx context.Context, input Input) (*Prepared, error) {
|
|
if err := ctx.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
if input.Config == nil {
|
|
return nil, fmt.Errorf("application configuration is required")
|
|
}
|
|
if input.Transcript == nil {
|
|
return nil, fmt.Errorf("transcript is required")
|
|
}
|
|
session, err := diagnostics.SelectOutput(input.Output)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := ctx.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := session.Prepare(); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := ctx.Err(); err != nil {
|
|
_ = session.Close()
|
|
return nil, err
|
|
}
|
|
if err := session.Initialize(input.InitialReports, input.FailedReports); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := ctx.Err(); err != nil {
|
|
return nil, session.Finish(err, nil, input.FailedReports, func([]diagnostics.FileFailure) diagnostics.ReportBundle { return input.FailedReports })
|
|
}
|
|
result := &Prepared{Output: session}
|
|
if input.Debug != nil {
|
|
result.Debug, result.Warnings = session.PrepareDebug(input.Debug.WorkDir, input.Debug.RunID, input.Debug.Metadata, input.Debug.EffectiveConfig, input.Debug.Secrets...)
|
|
}
|
|
if err := ctx.Err(); err != nil {
|
|
return nil, session.Finish(err, nil, input.FailedReports, func([]diagnostics.FileFailure) diagnostics.ReportBundle { return input.FailedReports })
|
|
}
|
|
return result, nil
|
|
}
|