Honor cancellation at standard inspection boundaries

This commit is contained in:
2026-10-07 16:47:28 +00:00
parent 12841f15c8
commit 4cb795cc20
7 changed files with 207 additions and 0 deletions

View File

@@ -83,6 +83,9 @@ type secretReferenceDTO struct {
}
func runConfigExplanation[C any](invocation Invocation, suite ConfigSuite[C], input configInput[C]) Outcome {
if err := invocation.Context.Err(); err != nil {
return Failure(err)
}
scopeNames, err := selectConfigScopes(suite, input, ConfigExplain)
if err != nil {
return Failure(err)
@@ -100,11 +103,18 @@ func runConfigExplanation[C any](invocation Invocation, suite ConfigSuite[C], in
if !ok || scope.Acquire == nil {
return Failure(fmt.Errorf("configuration scope %q has no acquisition callback", name))
}
if err := invocation.Context.Err(); err != nil {
return explanationFailure(err, nil, false)
}
acquired, acquireErr := scope.Acquire(invocation.Context, ConfigRequest{Operation: ConfigExplain, Selection: input.Selection}, contexts[name])
diagnostics := append([]Diagnostic(nil), acquired.Diagnostics...)
if acquireErr != nil {
return explanationFailure(acquireErr, diagnostics, false)
}
if err := invocation.Context.Err(); err != nil {
return explanationFailure(err, diagnostics, false)
}
if acquired.Value.Explanation == nil {
return explanationFailure(fmt.Errorf("configuration scope %q did not provide an explanation reader", name), diagnostics, false)
}
@@ -112,6 +122,9 @@ func runConfigExplanation[C any](invocation Invocation, suite ConfigSuite[C], in
if !found {
return explanationFailure(fmt.Errorf("configuration path %q is not known in scope %q", path.String(), name), diagnostics, false)
}
if err := invocation.Context.Err(); err != nil {
return explanationFailure(err, diagnostics, false)
}
if input.Format != "yaml" {
return writeNativeExplanation(invocation.Streams.Out, acquired.Value.Explanation, path, diagnostics)
}
@@ -119,6 +132,9 @@ func runConfigExplanation[C any](invocation Invocation, suite ConfigSuite[C], in
if err := encodeYAML(&report, makeExplanationReport(name, explanation)); err != nil {
return explanationFailure(err, diagnostics, false)
}
if err := invocation.Context.Err(); err != nil {
return explanationFailure(err, diagnostics, false)
}
if err := writeReport(invocation.Streams.Out, report.Bytes()); err != nil {
outcome := explanationFailure(err, diagnostics, true)
outcome.DeliveryError = err