package ckconfig import ( "errors" "fmt" commandkit "gitea.maximumdirect.net/eric/CommandKit" ) func runConfigDiff[I, S any](invocation commandkit.Invocation, plan *configOperationPlan[I, S], state S) commandkit.Outcome { if plan.comparison == nil || plan.comparison.scope == nil { cause := errors.New("configuration comparison was not prepared") return configFailure("Configuration comparison was not prepared.", commandkit.Explanation{}, cause) } selected := plan.comparison if err := invocation.Context.Err(); err != nil { return configFailure("Configuration comparison was canceled.", commandkit.Explanation{}, err) } compare := selected.scope.scope.Compare if compare == nil { cause := fmt.Errorf("configuration scope %q has no comparison callback", selected.scope.scope.Name) return configFailure("Configuration scope does not support comparison.", commandkit.Explanation{}, cause) } acquired, err := compare(invocation.Context, selected.request, state) reporter := invocation.Reporter() queueConfigDiagnostics(reporter, acquired.Diagnostics) if err != nil { return configFailure(fmt.Sprintf("Unable to compare configuration scope %q.", selected.scope.scope.Name), acquired.Explanation, err) } if err := invocation.Context.Err(); err != nil { return configFailure("Configuration comparison was canceled.", acquired.Explanation, err) } return renderPreparedConfigReport(invocation, acquired.Explanation, func() ([]byte, error) { return renderDiffReport(acquired.Value) }) }