// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package stackruntime import ( "context" "github.com/hashicorp/terraform/internal/stacks/stackruntime/internal/stackeval" ) // This file exposes a small part of the API surface of "stackeval" to external // callers. We need to orient it this way because package stackeval cannot // itself depend on stackruntime. // Hooks is an optional mechanism for callers to get streaming notifications // of various kinds of events that can occur during plan and apply operations. // // To use this, construct a Hooks object and then wrap it in a [context.Context] // using the [ContextWithHooks] function, and then use that context (or another // context derived from it that inherits the values) when calling into // [Plan] or [Apply]. // // All of the callback fields in Hooks are optional and may be left as nil // if the caller has no interest in a particular event. // // The events exposed by Hooks are intended for ancillary use-cases like // realtime UI updates, and so a caller that is only concerned with the primary // results of an operation can safely ignore this and just consume the direct // results from the [Plan] and [Apply] functions as described in their // own documentation. // // Hook functions should typically run to completion quickly to avoid noticable // delays to the progress of the operation being monitored. In particular, // if a hook implementation is sending data to a network service then the // actual transmission of the events should be decoupled from the notifications, // such as by using a buffered channel as a FIFO queue and ideally transmitting // the events in batches where possible. type Hooks = stackeval.Hooks // ContextWithHooks returns a context that carries the given [Hooks] as // one of its values. // // Pass the resulting context -- or a descendant that preserves the values -- // to [Plan] or [Apply] to be notified when the different hookable events // occur during that plan or apply process. func ContextWithHooks(parent context.Context, hooks *Hooks) context.Context { return stackeval.ContextWithHooks(parent, hooks) }