// 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 }