package ckconfig import ( "bytes" "fmt" "io" commandkit "go.maximumdirect.net/commandkit" ) type effectiveDocument struct { name string view View } func runConfigShow[I, S any](invocation commandkit.Invocation, plan *configOperationPlan[I, S], state S) commandkit.Outcome { documents := make([]effectiveDocument, 0, len(plan.scopes)) reporter := invocation.Reporter() for _, selected := range plan.scopes { if err := invocation.Context.Err(); err != nil { return configFailure("Configuration show was canceled.", commandkit.Explanation{}, err) } if selected.scope.scope.Acquire == nil { return commandkit.Failure(fmt.Sprintf("Configuration scope %q has no acquisition callback.", selected.scope.scope.Name)) } acquired, acquireErr := selected.scope.scope.Acquire(invocation.Context, Request{Operation: Show, Selection: plan.selection}, selected.input, state) if acquireErr != nil { return configAcquisitionFailure(reporter, "show", selected.scope.scope.Name, acquired, acquireErr) } queueConfigDiagnostics(reporter, acquired.Diagnostics) if err := invocation.Context.Err(); err != nil { return configFailure("Configuration show was canceled.", acquired.Explanation, err) } if acquired.Value.Effective == nil { return commandkit.Failure(fmt.Sprintf("Configuration scope %q did not provide an effective configuration writer.", selected.scope.scope.Name)) } documents = append(documents, effectiveDocument{name: selected.scope.scope.Name, view: acquired.Value}) } if err := invocation.Context.Err(); err != nil { return configFailure("Configuration show was canceled.", commandkit.Explanation{}, err) } var value any err := reporter.RenderOutput(func(io.Writer) error { values := make(map[string]any, len(documents)) for _, document := range documents { if err := invocation.Context.Err(); err != nil { return err } var native bytes.Buffer if err := document.view.Effective.WriteEffective(&native); err != nil { return err } decoded, err := commandkit.DecodeYAMLReport(&native) if err != nil { return err } values[document.name] = decoded } if plan.scopeName == "all" { value = values } else { value = values[documents[0].name] } return nil }) if err != nil { if canceled := invocation.Context.Err(); canceled != nil { return configFailure("Configuration show was canceled.", commandkit.Explanation{}, canceled) } return commandkit.Success() } if err := invocation.Context.Err(); err != nil { return configFailure("Configuration show was canceled.", commandkit.Explanation{}, err) } _ = reporter.Report(commandkit.Report{Value: value}) return commandkit.Success() }